CodeIgniter 4 默认仅支持 database.default.* 单库配置,但可通过 .env 前缀区分(如 DB_PRIMARY_、DB_LOG_)并在 app/Config/Database.php 中手动注册多组配置实现多库切换,使用时调用 Database::connect('group') 即可。

CodeIgniter 4 本身不支持 .env 文件中按“组”定义多套数据库配置(比如 db_primary、db_backup、db_log),它的默认数据库配置只认 database.default.* 下的键。但你可以通过手动扩展配置 + 多个数据库组定义来实现多库切换,.env 中需用约定前缀区分,再在 app/Config/Database.php 中读取并注册。
下面是具体做法:
✅ .env 文件里怎么写多个数据库配置
用清晰前缀(如 DB_PRIMARY_、DB_LOG_、DB_REPORT_)区分不同库,避免冲突:
# 主库 DB_PRIMARY_HOSTNAME = "192.168.1.10" DB_PRIMARY_PORT = 3306 DB_PRIMARY_DATABASE = "myapp_main" DB_PRIMARY_USERNAME = "user1" DB_PRIMARY_PASSWORD = "pass1" DB_PRIMARY_CHARSET = "utf8mb4" # 日志库 DB_LOG_HOSTNAME = "192.168.1.11" DB_LOG_PORT = 3307 DB_LOG_DATABASE = "myapp_logs" DB_LOG_USERNAME = "logger" DB_LOG_PASSWORD = "logpass" DB_LOG_CHARSET = "utf8mb4" # 报表库(可能是只读从库) DB_REPORT_HOSTNAME = "192.168.1.12" DB_REPORT_PORT = 3306 DB_REPORT_DATABASE = "myapp_reports" DB_REPORT_USERNAME = "reporter" DB_REPORT_PASSWORD = "reppass" DB_REPORT_CHARSET = "utf8mb4"
⚠️ 注意:
- 不要写
DB_HOSTNAME这类无前缀的通用键,否则会被默认组覆盖;- 端口必须写数字(不能带引号),如
DB_PRIMARY_PORT = 3306,不是"3306";- Hostname 支持域名或 IP,也支持
localhost(但注意 PHP-FPM 下localhost可能走 socket,建议用127.0.0.1明确走 TCP)。
✅ 在 app/Config/Database.php 中注册多个组
打开该文件,找到 public $defaultGroup = 'default';,然后在 $DBGroups 数组里添加你定义的组:
public $DBGroups = [
'default' => [
'DSN' => '',
'hostname' => env('DB_PRIMARY_HOSTNAME', 'localhost'),
'port' => env('DB_PRIMARY_PORT', 3306),
'username' => env('DB_PRIMARY_USERNAME', ''),
'password' => env('DB_PRIMARY_PASSWORD', ''),
'database' => env('DB_PRIMARY_DATABASE', ''),
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => env('DB_PRIMARY_CHARSET', 'utf8mb4'),
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => (int) env('DB_PRIMARY_PORT', 3306), // 强制转整型
],
'log' => [
'DSN' => '',
'hostname' => env('DB_LOG_HOSTNAME', 'localhost'),
'port' => (int) env('DB_LOG_PORT', 3307),
'username' => env('DB_LOG_USERNAME', ''),
'password' => env('DB_LOG_PASSWORD', ''),
'database' => env('DB_LOG_DATABASE', ''),
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => env('DB_LOG_CHARSET', 'utf8mb4'),
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
],
'report' => [
'DSN' => '',
'hostname' => env('DB_REPORT_HOSTNAME', 'localhost'),
'port' => (int) env('DB_REPORT_PORT', 3306),
'username' => env('DB_REPORT_USERNAME', ''),
'password' => env('DB_REPORT_PASSWORD', ''),
'database' => env('DB_REPORT_DATABASE', ''),
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => env('DB_REPORT_CHARSET', 'utf8mb4'),
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
],
];✅ 在代码中使用指定数据库组
-
获取主库连接(默认):
$db = \Config\Database::connect();
-
获取日志库连接:
$logDB = \Config\Database::connect('log'); -
获取报表库连接:
$reportDB = \Config\Database::connect('report'); -
在 Model 中指定连接组(可选):
protected $DBGroup = 'log';
✅ 小贴士:端口和 hostname 的常见坑
- 如果某库用的是非标端口(如
3307),务必确认 MySQL 服务已监听该端口且防火墙放行; -
hostname写localhost时,MySQLi 驱动可能尝试 Unix socket,导致连接失败;生产环境建议统一用127.0.0.1或内网 IP; - 所有
env()调用都建议加默认值,防止.env缺失字段时报错; - 修改
.env后,不需要重启 Web 服务器,但 CLI 命令(如spark migrate)会立即生效;Web 请求下次加载即生效。
这样就实现了真正意义上的多库分组管理,结构清晰、环境隔离、运维友好。


















