Symfony4.4中Doctrine迁移重复生成ALTER语句及忽略列方法咨询
问题:Doctrine Migrations重复生成相同ALTER语句(虚拟生成列场景)
我基于Symfony 4.4和Doctrine Migrations Bundle 3.2.1开发项目,使用columnDefinition定义了特殊的虚拟生成列:
columnDefinition="VARCHAR(50) GENERATED ALWAYS AS (IF(ISNULL(`cabinet_id`), 'null', `cabinet_id`)) VIRTUAL"
该列运行正常,但每次执行doctrine:migrations:diff时,都会生成完全相同的ALTER语句:
ALTER TABLE MonitoringReportUpdate CHANGE virtual_null `virtual_null` VARCHAR(50) GENERATED ALWAYS AS (IF(ISNULL(`cabinet_id`), \'null\', `cabinet_id`)) VIRTUAL
即使执行完这条语句后再次运行doctrine:migrations:diff,仍会生成相同的语句。想知道这是columnDefinition使用错误、存在Bug,还是可以忽略这个重复生成的迁移?
原因与解决方案
- 核心原因:Doctrine ORM的SchemaManager读取MySQL虚拟生成列定义时,会自动格式化SQL表达式(比如移除反引号、调整空格),但你在
columnDefinition里给字段名加了反引号cabinet_id,导致Doctrine对比数据库列定义和实体映射时,判定两者不一致,因此每次diff都会重复生成ALTER语句。 - 修复方法:移除
columnDefinition里字段名的反引号,修改为:
这样Doctrine读取数据库中的列定义后,格式化后的表达式会和映射里的内容一致,就不会再重复生成迁移了。columnDefinition="VARCHAR(50) GENERATED ALWAYS AS (IF(ISNULL(cabinet_id), 'null', cabinet_id)) VIRTUAL" - 是否可忽略:如果暂时不想修改映射,这条重复的迁移可以忽略——执行它不会改变数据库状态,因为列定义本身没有变化,但每次diff都生成会干扰正常的迁移流程,建议优先修复映射。
内容的提问来源于stack exchange,提问作者Starshov
相关产品推荐
相关产品推荐

