CodeIgniter4通过定义多个数据库组(如$second_db)并调用Database::connect('second_db')实现多库连接,而非重复定义$default;组名须为合法PHP变量名,且需完整配置DBDriver等参数。

在 CodeIgniter4 的 app/Config/Database.php 文件中,定义第二个(或更多)数据库连接,不是通过添加多个同名的 $default 数组,而是通过在 $factories 数组中注册额外的数据库组配置,并配合使用 Database::connect('group_name') 来调用。
CodeIgniter4 使用“数据库组(database group)”机制管理多库,每个组对应一个独立的连接配置。默认的 'default' 组已存在,你要加第二个库,只需:
✅ 正确方式:在 Database.php 中新增一个数据库组
打开 app/Config/Database.php,找到类似这样的结构:
public $default = [
'DSN' => '',
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'db_main',
'DBDriver' => 'MySQLi',
// ... 其他键
];✅ 在它下方(或同级位置),新增另一个组,比如叫 'second_db':
立即学习“PHP免费学习笔记(深入)”;
public $second_db = [
'DSN' => '',
'hostname' => 'localhost',
'username' => 'user2',
'password' => 'pass2',
'database' => 'db_backup',
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8mb4',
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306,
];? 注意:组名(如
second_db)就是你后续调用时传入的标识符,必须是合法 PHP 变量名(字母/下划线/数字开头,不能含短横线)。
✅ 在控制器或模型中使用第二个库
use CodeIgniter\Database\ConnectionInterface;
// 获取第二个数据库连接
$db2 = \Config\Database::connect('second_db');
// 执行查询(返回 QueryResult 对象)
$result = $db2->query("SELECT * FROM users")->getResult();
// 或用 Query Builder
$users = $db2->table('users')->get()->getResult();⚠️ 注意:不要用 db_connect()(这是 CI3 的函数),CI4 统一用 \Config\Database::connect('group_name')。
✅ 进阶:自动加载多个连接(可选)
如果你希望某些连接在启动时就初始化(例如用于审计日志写入),可在 app/Config/Database.php 的 $factories 数组中声明:
public $factories = [
'default' => '\CodeIgniter\Database\MySQLi\Connection',
'second_db' => '\CodeIgniter\Database\MySQLi\Connection',
];但通常无需手动设置 —— Database::connect() 内部会按需实例化,$factories 主要用于自定义驱动扩展。
❌ 常见错误提醒
- 把两个库都塞进
$default数组 → ❌ 会覆盖,只生效最后一个 - 在
.env中只配了一个database.default.*,却没配database.second_db.*→ ❌ 环境变量不匹配,要用database.second_db.hostname这类格式 - 忘记给新组设置
DBDriver(如'MySQLi'、'Postgre')→ ❌ 报错 “Driver not found”
直接改完 Database.php 就生效,无需清缓存(除非你开启了配置缓存且修改了缓存过的 Config 类 —— 一般开发环境不用管)。



















