DATABASE_URL必须使用postgresql://协议头,不可用pgsql://或遗漏s;密码含特殊字符需URL编码;serverVersion参数必填;pg_hba.conf须正确配置以允许连接。

DATABASE_URL 必须用 postgresql:// 协议头
别写成 pgsql:// 或漏掉 s,Doctrine 只认 postgresql://。漏一个字符就报 Unknown database driver "pgsql" 或直接静默失败。
- 正确写法:
DATABASE_URL="postgresql://user:pass%40word@127.0.0.1:5432/myapp?serverVersion=15&charset=utf8mb4" -
127.0.0.1代替localhost:避免 PostgreSQL 尝试走 Unix socket(尤其 Docker 或某些系统上会报No such file or directory) - 密码含
@、/、:必须 URL 编码,比如my/pass@123→my%2Fpass%40123 -
serverVersion必填:PostgreSQL 15 写?serverVersion=15,不写可能导致 DQL 生成错误语法(如对GENERATED ALWAYS AS的支持判断失准) - 推荐加
&charset=utf8mb4:虽然 PostgreSQL 默认支持全 Unicode,但 Doctrine 驱动层会据此设置client_encoding,避免 emoji 或某些生僻字存取异常
pg_hba.conf 不配好,连 localhost 都被拒
Symfony 连不上,不一定是 URL 错——很可能是 PostgreSQL 拒绝了连接请求。默认安装只允许 local(Unix socket)和 host 本地回环的 md5 认证,但如果你改过监听地址或在 Docker 外连容器内 PG,就得手动放行。
- 编辑
/etc/postgresql/*/main/pg_hba.conf(CentOS/Debian 路径略有不同),在末尾加一行:host all all 127.0.0.1/32 md5 - 如果 Symfony 应用和 PostgreSQL 不在同一台机器(比如本地开发连远程服务器或 Docker 容器),还要加:
host all all 0.0.0.0/0 md5(仅测试环境;生产务必限制 IP 段) - 改完必须执行:
sudo systemctl reload postgresql(不是 restart),否则配置不生效 - 常见错误现象:
SQLSTATE[08006] [7] connection to server at "127.0.0.1", port 5432 failed: FATAL: no pg_hba.conf entry for host "127.0.0.1", user "user", database "myapp", SSL off
本地开发连 Docker PostgreSQL 容器时主机名解析失败
你在 .env 里写了 host=my_els_db_postgres,但 Symfony 运行在宿主机上,根本不知道这个服务名——Docker 的内部 DNS 只对同网络的容器有效。
- 最干净解法:把 Symfony 应用也容器化,和数据库共用
docker-compose.yml中定义的网络,host直接填服务名(如database) - 临时调试可用 hosts 映射:先运行
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my_els_db_postgres拿到容器 IP,再往宿主机/etc/hosts加一行:172.17.0.2 my_els_db_postgres - 千万别在
.env里写host=localhost并指望它连进容器——除非你做了端口映射且确认容器 5432 端口已暴露(ports: ["5432:5432"]),否则大概率连错本地 PG 实例
验证连接前先确认用户权限和认证方式
php bin/console doctrine:database:create 报 Access denied,90% 不是密码错了,而是 PostgreSQL 用户没开登录权限或用了不兼容的认证插件。
- 以
postgres用户登录 PG:sudo -u postgres psql - 检查目标用户是否允许登录:
SELECT usename, usesysid, usecreatedb, userepl FROM pg_user WHERE usename = 'your_user';——usesysid为t才能登录 - 若用的是 PostgreSQL 15 默认的
scram-sha-256认证,而旧版 PHP/PDO 不支持(尤其某些 Alpine 镜像),需降级:ALTER USER your_user WITH PASSWORD 'newpass';(触发重哈希)或显式设为:ALTER USER your_user WITH PASSWORD 'newpass' PASSWORD_encryption = 'md5'; - 检查
pg_hba.conf对应用户的认证方法是否为md5或scram-sha-256,和实际密码加密方式一致
pg_hba.conf 权限、容器网络隔离、认证插件兼容性,这三处任一出问题,都会让 Symfony 在建连阶段就静默失败。


















