Symfony 4.4 可直接运行旧迁移文件,但需满足三项前提:升级 doctrine/doctrine-migrations-bundle ≥ 3.0、确保 doctrine_migration_versions 表结构兼容、检查迁移中无 DBAL 3.x 已弃用功能(如 unsigned 或 autoincrement)。

能用,但必须满足几个前提条件,否则执行会失败或行为异常。
迁移文件本身语法兼容,但执行环境变了
Symfony 4.4 没修改 Doctrine Migrations 的核心格式(如 VersionXXXXXX.php 结构、up()/down() 方法签名),所以旧迁移文件无需重写。但能否成功运行,取决于底层依赖、数据库配置和框架集成状态是否匹配。
必须检查并修复的三项关键点
-
确保
doctrine/doctrine-migrations-bundle版本 ≥ 3.0
Symfony 4.4 默认要求doctrine/doctrine-migrations-bundle:^3.0(对应doctrine/migrations:^3.0)。如果仍停留在^2.2(常见于 4.2 升级后未更新),会出现Class "Doctrine\Migrations\Version" not found或Migration class must implement VersionInterface错误。运行以下命令升级:composer require doctrine/doctrine-migrations-bundle:^3.0 --with-all-dependencies
-
验证
doctrine_migrations表结构与新版本兼容
Doctrine Migrations v3 引入了新的元数据表字段(如execution_date、status),如果旧迁移是在 v2 下执行的,doctrine_migration_versions表可能缺少这些列。首次在 v3 下运行doctrine:migrations:migrate时,Bundle 会自动尝试补全,但前提是:- 数据库用户有
ALTER TABLE权限 - 表名确实是
doctrine_migration_versions(不能自定义为其他名) - 若手动改过表结构或字段类型,需先执行
php bin/console doctrine:migrations:sync-metadata-storage修复元数据存储
- 数据库用户有
-
检查迁移中是否用了已被弃用的 DBAL 功能
Doctrine DBAL 3.x(随 Symfony 4.4 推荐升级)移除了部分方法,例如:-
$schema->getTable('user')->addColumn(...)中若传入options=['unsigned' => true],MySQL 平台会报错(unsigned已被弃用) - PostgreSQL 迁移中若含
options=['autoincrement' => true],会被忽略且可能导致 diff 误判(见 ID 自增失效问题)
建议对所有旧迁移文件运行php bin/console doctrine:migrations:execute --dry-run <version>查看拟执行 SQL,确认无平台不兼容语句
-
特别注意:回滚行为略有变化
Migrations v3 默认启用事务包装(transactional: true),而 v2 在某些场景下可能跳过事务。如果你的旧 down() 方法依赖非事务性操作(比如跨库 DDL 或外部服务调用),需人工验证逻辑是否仍成立;强烈建议在开发环境用 --dry-run 先预览。
只要上述三点都通过,已应用的旧迁移不会重新执行,未执行的也能照常 migrate,无需重建整个迁移历史。


















