CodeIgniter支持多数据库配置与切换,需在database.php中定义多个连接组并命名区分,运行时通过load->database()加载指定组或动态传参创建实例,注意事务、缓存及调试设置的独立性。

CodeIgniter 支持在同一应用中配置并切换多个数据库,关键在于合理组织 database.php 中的连接组,并在运行时按需加载指定组。静态配置适合固定环境(如主从分离、多租户),动态加载则适用于用户输入凭据等临时场景。
在 database.php 中定义多个连接组
每个数据库连接以独立键名(如 'default'、'writedb'、'report_db')注册到 $db 数组中,结构完全一致,互不影响:
- 修改
application/config/database.php,添加新组(例如'slave'或'log_db') - 确保每组都包含完整字段:
hostname、username、password、database、dbdriver、char_set等 - 不建议复用
default组做读写分离;应明确命名,如'master'和'slave' - 可通过
$active_group = 'master';设置默认加载组(仅影响自动加载的$this->db)
控制器或模型中手动切换数据库
使用 $this->load->database('group_name', TRUE) 加载指定组,返回独立的 DB 实例对象:
-
TRUE参数表示返回该连接对象(不自动赋值给$this->db),便于多库共存 - 常见用法:在模型构造函数中分别加载主库和从库,如
$this->master = $this->load->database('master', TRUE); - 避免覆盖
$this->db,尤其在已有自动加载的情况下;优先用自定义属性(如$this->writedb)保存实例 - 执行查询时直接调用该实例方法,例如
$this->writedb->insert('users', $data);
动态连接:运行时传参创建数据库实例
当数据库参数来自表单、API 或配置中心时,不依赖 database.php 静态配置,而是构造数组后传入 load->database():
- 构造关联数组,键名与
database.php中一致(如'hostname'、'database') - 调用
$db_obj = $this->load->database($config_array, TRUE);获取连接对象 - 注意校验必要字段(尤其是
dbdriver),缺失会导致连接失败且错误提示模糊 - 敏感信息(如密码)需过滤或脱敏处理,不可直接记录日志
注意事项与最佳实践
多数据库环境下容易忽略的细节会影响稳定性与可维护性:
- 各连接组的
dbprefix可不同,但表结构需自行保证兼容,框架不校验跨库表关系 - 事务(
trans_start())只对当前 DB 实例生效,无法跨库原子提交 - 查询缓存(
cache_on)需按连接组单独开启,路径(cachedir)建议隔离 - 调试模式(
db_debug)建议生产环境统一关闭,避免暴露数据库结构


















