CodeIgniter实现多数据库操作需在database.php中定义多个连接组,模型中通过load->database('组名', TRUE)加载并赋值给不同属性使用,支持读写分离与环境动态切换。

要在CodeIgniter中让一个应用同时操作多个数据库,比如实现读写分离、跨库查询或微服务间数据互通,必须在配置文件中明确定义多个独立连接组,而不是简单修改默认配置。
基础配置:添加第二个数据库连接组
打开 application/config/database.php 文件,在已有 $db['default'] 配置下方新增一个命名唯一的连接组,例如 $db['reportdb']:
填写完整参数,包括 hostname、username、password、database、dbdriver,其余如 char_set 和 dbcollat 建议与 default 保持一致;
务必把 pconnect 设为 TRUE 或 FALSE —— 若两个库部署在同一台服务器且并发高,设为 TRUE 可复用连接;若涉及远程主从或权限隔离,建议设为 FALSE 避免连接残留干扰;
不要遗漏 autoinit => TRUE,否则加载后不会自动初始化连接,调用时会报“Call to a member function on null”错误。
模型中加载并使用多库连接
在 Model 类构造函数中,用 $this->load->database('组名', TRUE) 加载指定连接:
方法一:分别赋值给不同属性(推荐)
$this->main_db = $this->load->database('default', TRUE);
$this->log_db = $this->load->database('logdb', TRUE);
这样后续可直接调用 $this->main_db->insert() 或 $this->log_db->get(),语义清晰、不易混淆;
方法二:临时切换默认连接(慎用)
执行 $this->db = $this->load->database('archive', TRUE); 后,所有未指定对象的 $this->db->xxx() 都指向 archive 库;但该操作会覆盖当前 $this->db 引用,如果其他逻辑仍依赖原 default 连接,会导致后续查询失败。
进阶场景:按环境动态切换连接组
第一步:在 application/config/database.php 中定义三套连接组,例如 dev、staging、production;
第二步:确认 application/config/database.php 顶部已存在 $active_group = 'default'; 这行;
第三步:进入对应环境配置目录(如 application/config/production/database.php),覆盖写入 $active_group = 'production';;
第四步:确保 index.php 中 ENVIRONMENT 常量设为 'production',CI 就会自动加载该环境下对应的 $active_group 所指连接组;
这个机制不改变代码逻辑,只替换连接源头,适合灰度发布或A/B测试时隔离数据源。
验证连接是否生效
在任意控制器中写一段调试代码:
$db1 = $this->load->database('default', TRUE);
$db2 = $this->load->database('reportdb', TRUE);
var_dump($db1->hostname, $db2->hostname); // 应输出两个不同的IP或域名
如果输出 null 或报错“Unable to connect to your database server”,说明 hostname 写错、防火墙拦截、或 MySQL 用户没授权该 IP 访问目标库;
特别注意:MySQL 用户权限必须显式授予对应 hostname,localhost ≠ 127.0.0.1 ≠ 实际局域网IP。


















