codeigniter原生支持多数据库连接,需在配置文件中定义多组不重名连接参数(如default和slave),并通过显式调用加载对应实例;ci3用$this->load->database('group', true),ci4用service('database', 'slave')或database::connect('slave')。

CodeIgniter 支持在同一应用中同时连接多个 MySQL 数据库,关键在于正确配置多组数据库参数,并在使用时显式指定连接组。不需要额外插件,原生即可实现——比如读写分离、主从切换或跨库业务查询。
配置两个独立的数据库连接组
在 CI3 中,编辑 application/config/database.php;在 CI4 中,修改 app/Config/Database.php(注意路径和类结构差异)。核心是定义两套不重名的键名,例如 default 和 slave:
-
CI3 示例(数组格式):
$db['default']['hostname'] = '192.168.1.10'; // 主库$db['default']['database'] = 'main_db';$db['slave']['hostname'] = '192.168.1.11'; // 从库$db['slave']['database'] = 'backup_db';$active_group = 'default'; // 默认激活哪一组 -
CI4 示例(类属性格式):
在Database.php中新增一个同级配置实例:public $slave = [ 'DBDriver' => 'MySQLi', 'hostname' => '192.168.1.11', 'username' => 'user', 'password' => 'pass', 'database' => 'backup_db', ... ];
后续通过service('database', 'slave')获取该连接实例。
在控制器或模型中分别调用不同数据库
连接建立后,不能共用 $this->db(它只指向默认组),必须手动初始化目标连接:
-
CI3 写法:
$db1 = $this->load->database('default', TRUE); // 第二个参数 TRUE 表示返回对象而非赋给 $this->db$db2 = $this->load->database('slave', TRUE);
然后用$db1->get('users')或$db2->query("SELECT * FROM logs")分别操作。 -
CI4 写法:
$db1 = \Config\Database::connect(); // 默认$db2 = \Config\Database::connect('slave');
或更推荐:$db2 = service('database', 'slave');
常见踩坑点与验证建议
连不上多半不是逻辑问题,而是配置细节出错:
- 检查
$active_group(CI3)是否拼写正确,且对应键名在$db数组中真实存在; - CI4 必须用
MySQLi或PDO驱动,mysql已彻底废弃,填了会静默失败; - 若用 PDO,DSN 字段必须完整,例如:
'mysql:host=localhost;dbname=other_db;charset=utf8mb4'; - 改完配置后,CI4 务必执行
php spark cache:clear,否则旧缓存可能掩盖新设置; - 测试时开启
db_debug = TRUE,错误信息会直接暴露是权限拒绝、连接超时还是库不存在。
实用场景举例:主从读写分离
多数情况下,双库不是为了并列使用,而是分工明确:
- 写操作(INSERT/UPDATE/DELETE)走
default(主库); - 读操作(SELECT)优先走
slave(从库),减轻主库压力; - 可在基础模型中封装判断逻辑,例如:
if ($operation === 'read') { $this->db = $this->load->database('slave', TRUE); }。











