必须修改驱动类型(db_connection=pgsql)、端口(db_port=54321)、连接名(db_database等),三者缺一不可;金仓兼容postgresql但默认端口为54321,且需确保php已启用pgsql扩展并正确配置pg_hba.conf权限。

直接配就行,但必须改对三个地方:驱动类型、端口、连接名,缺一不可。金仓(KingbaseES)这类兼容 PostgreSQL 的数据库也走这套逻辑,只是端口默认是 54321 而非 5432。
修改 .env 文件的四个关键配置项
PostgreSQL 连接不是改 DB_CONNECTION=mysql 就完事——Laravel 会按这个值去加载对应 driver,填错就报 Driver not supported 或直接卡在 PDO 初始化阶段。
-
DB_CONNECTION=pgsql—— 必须是pgsql,不是postgres或postgresql -
DB_HOST填服务器地址,本地用127.0.0.1(别用localhost,PHP 的 pgsql 扩展对它有 socket 行为差异) -
DB_PORT默认是5432,但金仓等国产库常用54321,不匹配会连不上且无明确错误提示 -
DB_DATABASE、DB_USERNAME、DB_PASSWORD按实际填写,注意密码里若含/、@、:等特殊字符,需 URL 编码(例如@→%40)
确认 PHP 已启用 pgsql 扩展
哪怕 .env 全对,没扩展也会报 Call to undefined function pg_connect() 或更隐蔽的 PDO::__construct(): could not find driver。
- 运行
php -m | grep pgsql,有输出才说明已启用 - Ubuntu/Debian 上装扩展:先
sudo apt install php-pgsql,再sudo systemctl restart apache2或sudo service php-fpm restart - Mac(Homebrew):用
brew install php@8.2-pgsql(版本号按你当前 PHP 版本调整) - Docker 用户注意:基础镜像如
php:8.2-apache默认不含 pgsql,需在Dockerfile中加docker-php-ext-install pdo_pgsql
测试连接是否真正生效
别只信 php artisan tinker 里敲 DB::connection()->getPdo() 返回对象——那只是 PDO 实例创建成功,不代表能查数据。
- 最简验证:执行一条真实查询,比如
DB::select('SELECT version() as v'),看是否返回 PostgreSQL 版本字符串 - 如果报
SQLSTATE[08006] [7] FATAL: database "xxx" does not exist,说明数据库名写错了,或该库确实没被创建 - 如果报
SQLSTATE[08006] [7] FATAL: password authentication failed for user "xxx",检查pg_hba.conf是否允许该用户从对应 host 登录(尤其是 Docker 场景下 host 设为host.docker.internal时) - 迁移失败时加
--pretend参数看生成的 SQL,确认表名、模式(schema)前缀是否符合预期(PostgreSQL 默认 schema 是public)
最容易被忽略的是:PostgreSQL 用户默认没有 CREATEDB 权限,跑 php artisan test --parallel 会直接失败,报 permission denied to create database。这不是 Laravel 配置问题,得进 psql 给用户授 CREATEDB 权——这点和 MySQL 完全不同。











