Symfony 4执行数据库更新命令后schema校验仍显示不同步问题排查
这种情况我碰到过好多次,看似执行了php bin/console doctrine:schema:update --force更新了数据库,但doctrine:schema:validate却一直报不同步,大概率是以下几个细节没处理到位,你可以挨个排查:
先清缓存!这是最常见的坑
Doctrine和Symfony都会缓存实体元数据,有时候你改了实体代码,但缓存里还是旧的映射信息,导致validate读的是老schema。赶紧执行这两个命令清缓存:php bin/console cache:clear php bin/console doctrine:cache:clear-metadata开发环境直接清就行,生产环境记得加上
--env=prod参数。检查实体映射注解有没有写错
仔细核对你最近修改的实体类:是不是加了新字段但漏写了@Column注解?或者注解里的参数和数据库实际结构不符(比如nullable设置反了,字段类型写错,比如实体里是string但数据库里是int)?还有关联关系的inversedBy和mappedBy有没有对应上?这些小错误都会导致validate认为schema不一致。确认你操作的是同一个数据库
会不会update的时候用的是开发库,validate却连到了测试库?去检查.env或者.env.local里的DATABASE_URL,确保两个命令用的是同一个数据库连接。也可以用php bin/console doctrine:database:list看看当前连接的数据库表,确认是不是你刚更新的那个库。检查数据库字段/表名的大小写问题
有些数据库(比如MySQL在Linux系统下)对表名、字段名大小写敏感,如果你实体里用的是驼峰命名,数据库里是下划线命名,但Doctrine的命名策略没配置对,就会被判定为不一致。去config/packages/doctrine.yaml里看看有没有设置naming_strategy: doctrine.orm.naming_strategy.underscore,这个配置会自动把实体的驼峰字段转成数据库的下划线字段。数据库里有没有未映射的表/字段
如果数据库里有你手动添加的表或者字段,但实体里没有对应的映射,validate也会提示不同步。这种情况要么给这些对象加上实体映射,要么删掉多余的表/字段,或者在Doctrine配置里加schema_filter来忽略这些不需要映射的对象。如果用了Doctrine Migrations,检查迁移状态
要是你项目里用了迁移组件,可能schema:update和迁移文件的状态不一致。试试生成新的迁移文件:php bin/console make:migration然后执行迁移:
php bin/console doctrine:migrations:migrate之后再跑
validate看看会不会正常。
内容的提问来源于stack exchange,提问作者viveka

