ThinkPHP 5.1 的 migrate 命令不支持多数据库配置,仅使用默认连接;TP6.0+ 需手动安装 think-migration 扩展并配置才支持 --connection 参数,且与 TP5.1 迁移文件不兼容,回滚需谨慎逐条执行。

ThinkPHP 5.1 的 migrate 命令不支持多数据库配置
TP5.1 自带的迁移工具只认默认数据库连接,config/database.php 里定义了多个连接也没用。它内部硬编码调用了 Db::connect() 无参形式,不会传入连接名。
常见错误现象:InvalidArgumentException: Database configuration not found 或迁移表被写到错误库中。
- 如果必须操作非默认库,得临时改
database.default配置再执行,或手动在up()/down()方法里用Db::connect('other')显式指定 - 迁移类里的
$connection属性在 TP5.1 完全无效,设了也不生效 - TP5.1 的
think migrate:run不接受--connection参数,别白试
ThinkPHP 6.0+ 的 migrate 支持连接切换但需手动注册
TP6 把迁移从核心剥离成独立扩展 topthink/think-migration,默认不启用,得自己装、自己配。不是“升级就自动有”。
使用场景:项目已用 TP6 且需要按环境/模块分库做迁移(比如 tenant 表放 tenant_db,系统表放 sys_db)。
立即学习“PHP免费学习笔记(深入)”;
- 先执行
composer require topthink/think-migration - 在
app/command.php里手动添加命令映射:'migrate' => \think\migration\Command::class - 运行时可用
php think migrate:run --connection=tenant_db,但前提是该连接名已在config/database.php中正确定义 - 注意:TP6.3+ 对
think-migration扩展有版本要求,v3.0.0+才支持 Laravel 风格的--path和--realpath
TP5.1 与 TP6 迁移文件结构不兼容
TP5.1 的迁移类构造函数签名是 __construct(Migration $migration),而 TP6 使用 Illuminate\Database\Migrations\Migration,两者基类不同,不能混用。
典型错误:把 TP5.1 写的迁移文件直接丢进 TP6 项目,运行时报 Class 'think\migration\Migration' not found 或方法不存在。
- TP5.1 迁移类必须继承
\think\migration\Migration - TP6 迁移类必须继承
\Illuminate\Database\Migrations\Migration,且依赖up/down方法接收Blueprint实例 - 字段定义语法也不同:TP5.1 用
$table->string('name', 50),TP6 同样写法但底层走的是 Illuminate Schema Builder,不识别 TP5.1 的自定义类型如set - 别试图用
php think migrate:refresh回滚跨版本写的迁移——它会卡在第一个不兼容类上
迁移回滚失败时,migrate:rollback 在 TP6 中可能静默跳过
TP6 的 think-migration v2.x 在遇到某个迁移 down() 报错时,默认行为是跳过并继续执行下一个,而不是中断。这会让数据库状态和迁移记录严重不一致。
容易踩的坑:你看到终端输出 “Rolled back N migrations”,实际只有前两个成功回滚,后面几个因 SQL 错误被忽略,但 migrations 表里记录已被删。
- 加
--force参数不会改变这个逻辑,它只绕过确认提示 - 真正可靠的回滚方式是手动查
migrations表,定位最后成功执行的 batch,然后用php think migrate:rollback --step=1逐条试 - 生产环境务必先备份
migrations表和目标表结构,TP6 的回滚没有事务包装,出错无法自动还原



















