ThinkPHP 6 数据库配置文件迁移 5.1 差异【对照】
ThinkPHP6数据库配置相比5.1改动显著:配置文件从单文件变为拆分分层且依赖.env;DSN连接被移除,改用数组配置;读写分离升级为模型绑定与部署模式;迁移命令需手动安装扩展并注册。需注意.env文件必须存在且命名准确,多库配置依赖连接名,从库配置须为二维数组,迁移文件不兼容。
先说几个核心判断:ThinkPHP 6 的数据库配置,跟 TP5.1 相比,改动幅度相当大,绝不是简单复制粘贴旧版配置文件就能搞定的事。从结构到逻辑,再到扩展支持,底层逻辑都变了样。如果直接迁移,大概率会遇到连库失败、读写分离不生效、迁移命令报错这类问题,甚至环境变量都读不出来。

所以,这篇文章把几个关键差异点拆开来讲,希望能帮大家少走弯路。
配置文件结构:从单文件大数组转向拆分+分层覆盖
TP5.1 时代,一个 database.php 文件搞定一切,所有数据库连接写在一个大数组里返回就行。但到了 TP6,这套玩法就彻底变了——配置必须按功能拆分,而且依赖 .env 文件来做运行时的动态覆盖。
- TP5.1 里直接写
'hostname' => 'localhost'没问题,TP6 则必须写成'hostname' => env('DB_HOST', 'localhost'),否则env()函数读不到值。 - 还有一点很容易踩坑:
.env文件必须存在,且命名必须准确,不能是.env.local这种变体,否则环境变量加载会失败。 - 如果你新增了自定义配置,比如
config/oss.php,它不会自动加载,需要在config/autoload.php里显式声明return ['oss'];才行。
数据库连接方式:DSN 彻底退场,全转向数组配置
TP5.1 支持 DSN 字符串连接,比如 mysql://root:123@127.0.0.1:3306/db#utf8,用起来很灵活。但 TP6 已经彻底移除了这个能力,所有连接必须通过数组定义,并且要在 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 则改成了基于 deploy 和 rw_separate 的模型级路由策略,灵活性大幅提升,但配置复杂度也上来了。
- 举个典型例子:在 TP5.1 中,
where()->find()和where()->value()行为一致,都会走从库(如果开启了读写分离)。但在 TP6 中,后者可能绕过从库,因为底层调用的是query方法,而非select。 - 从库配置必须是二维数组格式:
'sla ve' => [['host' => 's1'], ['host' => 's2']]。如果写成了一维数组,系统会静默失败,但不会报错,排查起来很头疼。 - 另外,TP6 默认启用了连接池,主从连接会分别缓存。升级后一定要检查一下,高并发场景下从库连接数是否出现了异常飙升。
迁移与扩展支持:迁移命令需手动装配,不再内置
TP5.1 自带 think migrate 命令,而且默认支持多连接(虽然有一些缺陷)。到了 TP6,迁移能力被完全剥离,需要手动安装扩展、注册命令、初始化元数据表,三步缺一不可。
- 首先,必须执行
composer require topthink/think-migration:^4.0(TP6.3+ 版本推荐这个版本)。 - 然后,在
config/console.php的'commands'数组中,加入thinkmigrationCommand::class,这样命令才能被系统识别。 - 最后,必须先运行
php think migrate:install创建think_migration表,否则后续的run命令会直接失败。 - 还有一点,TP5.1 的迁移文件不能直接拿来用。类继承、构造函数签名、方法参数全都不兼容,需要重新编写。


































