Doctrine每次生成迁移都会新增UUID列修改语句问题求助
排查方向
- 首先确认是否安装了
ramsey/uuid-doctrine扩展包,仅安装ramsey/uuid不足以支持Doctrine正确识别UUID类型映射:
可通过composer show ramsey/uuid-doctrine检查是否已安装,未安装执行composer require ramsey/uuid-doctrine即可。 - 检查Doctrine的DBAL类型配置,是否正确注册了UUID类型映射
以Symfony框架的config/packages/doctrine.yaml配置为例,需要添加如下配置:
未正确配置类型映射的情况下,Doctrine每次比对数据库结构时都会认为实体的UUID类型和数据库存储的UUID类型不匹配,就会重复生成ALTER语句。doctrine: dbal: types: uuid: Ramsey\Uuid\Doctrine\UuidType - 检查
verification表的实际结构
你提供的down方法中出现了verification_id字段名,和你实体配置映射的id字段名不匹配,先确认数据库内该表的主键列名到底是id还是verification_id:
如果数据库内实际列名为verification_id,需要在实体的@ORM\Column注解中明确指定name="verification_id";如果是之前修改过主键属性名残留的旧结构问题,把数据库内的列名修改为和映射一致的id即可。 - 先执行schema比对命令确认差异来源
运行php bin/console doctrine:schema:update --dump-sql,如果输出的SQL和你迁移文件里的ALTER语句一致,说明问题出在Doctrine核心的schema比对逻辑,和迁移bundle无关,优先排查映射配置即可。 - 排除默认值配置冲突
部分情况下如果数据库层面给主键列设置了uuid_generate_v4()作为默认值,而实体使用的是应用层面的自定义ID生成器,Doctrine会每次都尝试删除数据库层面的默认值。可检查表结构是否存在该默认值,确认是否需要保留,不需要的话手动执行一次删除默认值的语句即可。
内容的提问来源于stack exchange,提问作者grzesiek16016
相关产品推荐
相关产品推荐

