ThinkPHP数据库迁移依赖命令行工具、迁移文件和元数据表协同工作,核心配置分散在console.php命令注册、migration.php行为控制及规范化的migrations目录结构中,需确保三者跨环境一致。

ThinkPHP 的数据库迁移功能不是靠配置文件驱动的,而是靠命令行工具 + 迁移文件 + 元数据表协同工作。所谓“migrations 配置文件”,实际并不存在一个叫 migrations.php 的核心配置项——真正起作用的是三类东西:扩展安装状态、命令注册配置、迁移元数据表。工程化落地的关键,是让这三者稳定、可复现、跨环境一致。
migrations 目录本身不需要额外配置,但路径和命名必须严格合规
迁移文件只被框架从固定路径扫描:database/migrations/(注意是 migrations,不是 migrate 或 migration)。
- 文件名必须带 14 位时间戳前缀(如
20260701103000_create_users_table.php),否则会被静默跳过; - 类名需与文件名中下划线后部分一致(如
CreateUsersTable),且继承\think\migration\Migrator; - 所有迁移操作(建表、加字段、删索引等)必须写在
up()和down()方法内,不能依赖模型或业务逻辑。
config/console.php 是迁移命令生效的“开关”
TP6/TP7 默认不注册迁移命令,必须手动开启:
- 打开
config/console.php,确保'commands'数组包含:'\think\migration\Command::class' - 若项目无该配置项,直接追加即可;老项目升级时容易遗漏这一步,导致
php think migrate:run报 “Command not defined”; - 执行
php think list验证输出中是否出现migrate:install、migrate:run等命令,没有就说明注册失败。
config/migration.php 控制迁移行为,非必需但强烈建议配置
该文件由 topthink/think-migration 自动创建(首次运行 migrate:install 后生成),用于指定:
-
connection:明确指向app/database.php中定义的某个连接标识(如'mysql'),避免多库环境下误操作; -
table_name:默认为'think_migration',可自定义,但所有环境必须统一; -
path:默认就是database/migrations/,不建议修改,改了需同步调整自动加载逻辑。
生产环境部署必须保留迁移扩展,且禁用危险命令
-
composer install --no-dev会剔除require-dev里的包,但topthink/think-migration必须放在require区(不是require-dev),否则线上无法执行迁移; - 绝对禁止在生产环境使用
migrate:refresh或migrate:reset—— 前者清空再重建全部表,后者直接删 migration 表并重置状态,等于主动删库; - 推荐上线流程:先
migrate:status核对当前版本,再migrate:run执行待迁移项,全程可审计、可回退。
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











