thinkphp 数据库迁移需严格匹配版本、命名规范与依赖逻辑:tp6/7 用 think-migration 4.x,tp5 用 2.x;迁移文件须置于 database/migrate/ 下且命名格式为 yyyymmddhhiiss_描述;必须检查表/字段存在性、外键顺序及多库连接显式指定。

ThinkPHP 项目要实现数据库迁移(Migration),不能直接用 composer require topthink/think-migration 就完事——必须确认 TP 版本、PHP 版本、扩展版本三者对齐,否则 php think migrate:install 会报错或迁移文件不被识别。
tp6/tp7 必须用 think-migration 4.x
TP5.x 和 TP6/TP7 的迁移扩展不兼容:topthink/think-migration 2.x 只支持 TP5,且已停止维护;TP6/TP7 必须用 4.x(截至 2026 年 5 月最新为 4.3.x)。装错版本会导致命令不存在、类找不到或 up() 方法执行失败。
- 装 TP6/TP7:运行
composer require topthink/think-migration:^4.3(不加@dev) - 装 TP5.x:只能用
composer require topthink/think-migration:^2.0,且 PHP ≤ 8.0 - 装完立刻执行
composer dump-autoload,否则php think migrate:install会提示类未加载
迁移文件名和目录位置不能错
ThinkPHP 的迁移命令只扫描 database/migrate/ 目录下、类名严格匹配 YYYYMMDDHHIISS_* 格式的 PHP 文件。哪怕多一个空格、少一位时间戳,php think migrate 都会跳过它。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 正确命名:
20230101000000_create_user_table.php(14 位数字 + 下划线 + 描述) - 错误命名:
create_user_table_20230101.php、20230101_create_user_table.php(位数不足)、2023-01-01_create_user_table.php(含短横线) - 类必须继承
think\migration\Migrate,且包含up()和down()方法 - 目录需确保 Web 服务器和 CLI 用户都有读写权限,Docker 环境尤其注意挂载权限
执行迁移前必须检查外键和表存在性
php think migrate 报错最常见两类:SQLSTATE[HY000]: General error: 1005 Can't create table(外键失败)和 SQLSTATE[42S01]: Base table or view already exists(重复建表)。这不是命令问题,是迁移逻辑没兜底。
- 建表前加判断:
if (!$this->hasTable('user')) { $this->table('user')->create(); } - 加外键前确保关联表已存在,或把建表语句按依赖顺序排列(如先
create_user_table,再create_order_table) - 删字段前检查:
if ($this->hasColumn('user', 'phone')) { $this->table('user')->dropColumn('phone'); } - 生产环境执行前,务必先在测试库跑一次
php think migrate:rollback,验证down()是否真能回滚
多数据库连接必须显式指定 --connection
项目用了多个数据库配置(比如 mysql_master 和 mysql_slave),但 php think migrate 默认只操作 default 连接。不加参数就执行,迁移表(migration)可能建在错库,后续所有迁移都失效。
- 初始化迁移表时指定:
php think migrate:install --connection=mysql_master - 执行迁移时同步指定:
php think migrate --connection=mysql_master - 迁移类里不能硬编码连接名,要用
$this->connection = 'mysql_master';在构造函数中设置(4.x 支持) - CI/CD 脚本中务必写死
--connection,避免因环境变量缺失走默认连接
迁移不是“写完就跑”,关键在 up() 和 down() 的可逆性设计,以及对生产环境大表变更的敬畏——比如给千万级用户表加索引,得单独写 SQL 并配 ALGORITHM=INPLACE,别依赖框架的 addColumn() 自动推导。










