ThinkPHP多数据库配置必须严格遵循connections预定义+显式调用双约束机制:connections键名仅支持小写字母和下划线,不得含点号、大写或中横线;每个连接须完整配置type、hostname等字段且type值必须准确匹配驱动类型;Db::connect()参数必须为该键名,传错即报Connection not found。

connections 数组里的键名必须小写+下划线
ThinkPHP 不接受点号、大写字母或中横线作为连接键名。比如 mysql.read、MySQL_Write、mysql-write 全部非法,运行时直接报错 Connection not found。官方只认小写字母和下划线组合,像 mysql_read、log_db、backup_pg 这类命名才安全。
常见踩坑点:
- 复制 default 配置后只改了
database,忘了改键名,导致两个连接共用同一个键,后一个覆盖前一个 - 用 IDE 自动补全把
mysql_slave写成mysql_Slave,大小写敏感,查不到配置 - 在 .env 里写了
DB_CONNECTION=mysql.read,但框架不解析点号,实际还是走 default
每个连接都得显式写 type 字段
哪怕你只连 MySQL,也必须在每个连接配置里写 'type' => 'mysql'。漏掉这行,框架会拿默认驱动去解析你配的 PostgreSQL 或 SQL Server 参数,立刻抛出 Class 'PDO' not found——因为 PDO 扩展没装,或者类型不匹配。
不同数据库驱动对应值要严格一致:
立即学习“PHP免费学习笔记(深入)”;
- MySQL:
mysql - PostgreSQL:
pgsql - SQL Server:
sqlsrv - SQLite:
sqlite
传错 type 不仅连不上,还可能触发错误的 PDO DSN 构造逻辑,导致连接参数被忽略。
Db::connect() 的参数不是数据库名,是键名
调用 Db::connect('user_db') 时,user_db 必须和 config/database.php 中 connections 数组下的键完全一致。它不是数据库名,不是模型名,更不是表名。
这些写法全错:
-
Db::connect('user')(如果配置里键是user_db) -
Db::connect('UserModel')(模型类名无效) -
Db::connect(['hostname' => '127.0.0.1'])(临时数组不走连接池,高并发下耗尽连接数)
正确姿势是:先确保键存在,再调用;每次调用都返回新 Query 实例,不改变全局连接状态。
字符集和连接池问题最容易被忽略
两个库字符集不一致(比如主库 utf8mb4,备份库 gbk),必须各自显式声明 'charset' => 'utf8mb4'。不写就按框架默认值走,中文插入可能截断或乱码,且这种问题在线上压测阶段才暴露。
另一个隐形雷区是连接复用:ThinkPHP 的连接池管理依赖预定义键名。用 Db::connect([]) 动态传参,等于绕过连接池,每次新建物理连接。小流量看不出,一到批量同步或定时任务就触发 MySQL 的 max_connections 溢出。
改完配置别忘了清缓存:php think clear:config,否则新键名永远不生效。



















