symfony 4.4 的数据库迁移命令与 4.3 完全一致,但底层 doctrine migrations 升级至 v3,带来哈希校验、all_or_nothing 事务、sync-metadata-storage 标准化及更严格的 diff 逻辑和弃用提示。

Symfony 4.3 和 4.4 的数据库迁移命令本身没有实质性区别,底层都基于 Doctrine Migrations v2(或 v3 初期),核心命令如 doctrine:migrations:migrate、doctrine:migrations:diff、doctrine:migrations:status 等完全一致,语法、参数和行为逻辑基本兼容。
真正影响迁移体验的,是 Symfony 4.4 中对 Doctrine Migrations 的集成方式升级与默认配置变化,而非命令名变更。以下是关键差异点:
-
Doctrine Migrations 版本跃迁
Symfony 4.3 默认使用 Doctrine Migrations v2.x(如 v2.3),而 Symfony 4.4 起推荐并预装 v3.0+(从 v3.0.0 开始)。v3 引入了:- 更严格的版本校验(迁移文件哈希校验默认启用,防止手动修改后执行失败);
-
--allow-no-migration成为推荐标配(尤其 CI/CD 场景),v2 中该选项存在但非默认强调; -
doctrine:migrations:sync-metadata-storage命令正式成为标准流程一环(用于初始化或修复doctrine_migration_versions表结构),v2 中需手动建表或依赖旧脚本。
-
迁移生成逻辑更严格
在 4.4 中,doctrine:migrations:diff对实体扫描更敏感,例如:- 若实体未被正确加载(如
mappings配置遗漏或命名空间路径错误),它会直接报错No mapping found,而 4.3 可能静默跳过或生成空迁移; - 对
@ORM\GeneratedValue(strategy="IDENTITY")等现代 ID 策略支持更完善,减少 PostgreSQL/MySQL 下自增字段被误删的风险(这点在 4.3 中已存在但稳定性较弱)。
- 若实体未被正确加载(如
-
配置文件位置与默认值微调
Symfony 4.4 的config/packages/doctrine_migrations.yaml默认启用:doctrine_migrations: transactional: true # 更强调事务安全(4.3 默认也是 true,但 4.4 文档更突出其必要性) all_or_nothing: true # v3 新增,默认开启:整个迁移要么全成功,要么全回滚(4.3 不支持)
这意味着在 4.4 中,单个迁移内多条 SQL 出错时会自动回退,而 4.3 即使设了
transactional: true,也无法保证跨$this->addSql()调用的原子性。 弃用警告与兼容性提示增强
4.4 运行doctrine:migrations:diff时,若检测到过时注解(如@Doctrine\ORM\Mapping\...全路径写法)或废弃的 YAML mapping 方式,会明确抛出Deprecated提示;4.3 通常仅静默忽略或低级别日志。
简而言之:命令没变,但 4.4 的迁移系统更健壮、更严格、更面向生产——不是“能不能用”,而是“要不要按新规范重审你的迁移流程”。











