codeigniter 3 连 postgresql 必须用 pdo 驱动并启用 pdo_pgsql 扩展,dbdriver 固定为 'pdo',dsn 格式为 'pgsql:host=...;dbname=...;user=...;password=...',hostname 等字段无效,需验证连接并注意大小写与 schema 问题。

CodeIgniter 3 连 PostgreSQL 必须用 pdo 驱动,不能用 postgre(旧文档里写的那个已废弃且不兼容现代 PHP)。直接设 dbdriver = 'postgre' 会静默失败或报 Class 'CI_DB_postgre_driver' not found。
确认 PHP 已启用 pdo_pgsql 扩展
PostgreSQL 的 PDO 支持依赖 pdo_pgsql 扩展,不是 pgsql 或 pdo 单独启用就能用。
- Linux/macOS:运行
php -m | grep pdo_pgsql,没输出就需安装(如 Ubuntu 执行sudo apt install php-pgsql) - Windows:检查
php.ini中是否启用了extension=php_pdo_pgsql.dll(注意不是php_pgsql.dll) - 必须同时存在
pdo和pdo_pgsql——只开pdo不行,只开pdo_pgsql也不行 - 在浏览器访问
phpinfo()页面,搜索PDO drivers,确认列表里含pgsql
database.php 中正确配置 PDO+PostgreSQL DSN
CI3 不识别 hostname/port/username 等字段用于 PostgreSQL;这些值会被忽略。真正起作用的是 dsn 字符串,且 dbdriver 必须为 pdo。
-
dbdriver固定写'pdo',不是'postgre'或'pgsql' -
dsn格式为:'pgsql:host=localhost;port=5432;dbname=your_db_name;user=your_user;password=your_pass' -
hostname、username、password、database字段可留空或删掉,填了也无效 - 若 PostgreSQL 启用了 SSL,需在 DSN 中加
sslmode=require(例如:pgsql:host=...;sslmode=require)
连接验证与常见错误信号
CI3 加载 PDO 连接后不会自动抛异常,得主动触发验证,否则错连了也无提示。
- 在控制器中执行:
$this->load->database(); var_dump($this->db->conn_id);,返回bool(false)表示连接失败 - 若连接成功但查询报错
Undefined table或relation does not exist,大概率是 schema 不对(PostgreSQL 默认 schema 是public,表名需小写或加双引号) - 插入失败时调用
$this->db->error(),可能看到SQLSTATE[23505]: Unique violation或invalid byte sequence for encoding "UTF8"——后者说明char_set配置无效(PDO 下该字段被忽略,实际编码由 PostgreSQL 服务端和 DSN 决定) - 不要设
'stricton' => TRUE,PostgreSQL 没这个参数,设了会触发 warning
PostgreSQL 的大小写敏感性和 schema 机制是 CI3 用户最容易卡住的地方:表名默认转小写,字段名如果建表时用了双引号(如 "UserName"),查询时也必须带双引号,否则就找不到字段 —— 这跟 MySQL 完全不同,而且 CI3 的 Active Record 不做自动转义处理。











