Composer本身不执行数据库迁移,仅通过scripts调用php artisan migrate等实际迁移工具;它无DB连接、不解析SQL、不处理版本依赖,仅作命令转发,迁移逻辑必须由Laravel、Doctrine或Phinx等专用工具实现。

Composer 本身不处理数据库迁移,它只是 PHP 的依赖管理工具;真正执行迁移的是你项目里集成的迁移工具(比如 Laravel 的 php artisan migrate、Doctrine Migrations 或 Phinx)。直接用 Composer 写“迁移脚本”会走错方向。
为什么不能在 composer.json 里写迁移逻辑?
composer.json 的 scripts 字段只能定义命令别名或简单 shell 调用,它不解析 SQL、不连接数据库、也不理解迁移版本依赖。你看到的“composer run migrate”这类写法,本质是转发给真正的迁移命令执行器。
- Composer scripts 是同步、无上下文的 shell 环境,没有 DB 连接句柄,无法做事务控制或回滚判断
- 迁移需要读取迁移文件时间戳/版本号、检查
migrations表状态、按序执行——这些逻辑全在迁移工具内部 - 把 SQL DDL 写进
composer.json会破坏可维护性,也违反关注点分离
正确的做法:用 Composer scripts 封装迁移命令
在 composer.json 的 scripts 里声明快捷命令,指向实际迁移工具。例如 Laravel 项目:
"scripts": {
"migrate": "php artisan migrate",
"migrate:fresh": "php artisan migrate:fresh --seed",
"migrate:rollback": "php artisan migrate:rollback --step=1"
}
然后运行:
-
composer run migrate→ 执行所有待迁移 -
composer run migrate:fresh→ 清库重迁(开发环境慎用) - 注意:Laravel 9+ 要求明确加
--step参数才能 rollback,否则报错Unable to determine what to rollback
Phinx 用户要注意的路径和配置陷阱
Phinx 不依赖框架,但对目录结构敏感。如果你用 Composer 安装了 robmorgan/phinx,必须确保:
-
phinx.php配置文件放在项目根目录,且其中paths.migrations指向真实迁移文件夹(如./db/migrations) - 执行前要先生成迁移文件:
vendor/bin/phinx create CreateUserTable,而不是手动建 PHP 文件 - Composer script 要带
-c phinx.php -e development显式指定配置和环境,否则默认找phinx.yml且用development环境 - Phinx 的
up()/down()方法里不能用$this->execute('INSERT ...')执行非 DDL 语句——它只保证幂等性,数据变更应交由 seeder 处理
迁移不是“写个脚本就完事”,关键在版本对齐、环境隔离和失败恢复能力。很多人卡在 Migration table not found 或 SQLSTATE[HY000]: General error: 1005,其实问题往往出在迁移工具初始化没做(比如没跑 php artisan migrate:install),或者外键约束顺序错了——这些都不是 Composer 能解决的。


















