ThinkPHP 6 数据库配置需严格遵循拆分结构、.env 覆盖、数组连接、deploy+rw_separate 读写分离及手动装配迁移扩展,TP5.1 配置直接迁移会导致连库失败、分离失效或命令报错。

ThinkPHP 6 的数据库配置不是简单把 TP5.1 的 config/database.php 复制过去就能用,结构、加载逻辑、连接方式和扩展支持都变了。直接迁移容易导致连不上库、读写分离失效、迁移命令报错或环境变量不生效。
配置文件结构:从单文件大数组 → 拆分+分层覆盖
TP5.1 的 database.php 是一个返回完整配置数组的 PHP 文件,所有连接(包括多个数据库)都写在一个文件里;TP6.x 则要求配置必须按功能拆分,且依赖 .env 做运行时覆盖。
- TP5.1 中可直接写:
'hostname' => 'localhost',TP6.x 必须写成'hostname' => env('DB_HOST', 'localhost') -
.env文件必须存在且命名准确(不能是.env.local),否则env()读不到值 - 新增的自定义配置(如
config/oss.php)不会自动加载,需在config/autoload.php中显式声明return ['oss'];
数据库连接方式:DSN 彻底废弃,全改数组配置
TP5.1 支持 DSN 字符串连接(如 mysql://root:123@127.0.0.1:3306/db#utf8),TP6.x 已完全移除该能力,所有连接必须通过数组定义,并在 config/database.php 中显式声明连接标识。
- 旧写法
Db::connect('mysql://...')在 TP6 中会报错,必须改为Db::connect('mysql'),并确保database.connections.mysql存在对应配置 - 多库配置不再靠 DSN 区分,而是靠连接名(如
'sys_db'、'log_db'),并在各处显式传入 - TP6 不再识别
default键作为默认连接名,实际以database.default配置项为准
读写分离机制:从 SQL 类型判断 → 模型绑定 + 部署模式
TP5.1 的读写分离靠 'read_master' => true 控制,仅对 select 类查询尝试走从库,逻辑简单但不可控;TP6.x 改为基于 deploy 和 rw_separate 的模型级路由策略。
立即学习“PHP免费学习笔记(深入)”;
- TP5.1 中
where()->find()和where()->value()行为一致;TP6.x 中后者可能绕过从库,因底层调用的是query而非select - 从库配置必须是二维数组格式:
'slave' => [['host' => 's1'], ['host' => 's2']],一维会静默失败 - TP6 默认启用连接池,主从连接分别缓存,升级后需检查高并发下从库连接数是否异常飙升
迁移与扩展支持:迁移命令需手动装配,不内置
TP5.1 自带 think migrate 命令,且默认支持多连接(虽有缺陷);TP6.x 完全剥离迁移能力,必须安装扩展、注册命令、初始化元数据表,三者缺一不可。
- 必须执行:
composer require topthink/think-migration:^4.0(TP6.3+ 推荐) - 必须在
config/console.php的'commands'数组中加入\think\migration\Command::class - 必须先运行
php think migrate:install创建think_migration表,否则run会失败 - TP5.1 的迁移文件不能直接用于 TP6,类继承、构造函数签名、方法参数均不兼容



















