Django删除模型表及迁移文件后触发relation does not exist报错如何解决
报错根因
- 手动删除迁移文件的操作不符合Django迁移规则:Django的所有迁移执行历史都会同步存储在数据库的
django_migrations系统表中,仅删除本地迁移文件不会抹除数据库中已经记录的执行历史,新旧迁移逻辑无法对齐就会触发表不存在的报错。
当前问题修复步骤
- 先恢复你删除的那张独立表对应的创建迁移文件,保证本地迁移目录的记录和
django_migrations表的已执行记录对齐 - 执行
python manage.py migrate --fake <你的应用名> zero,该操作只会抹除django_migrations表中该应用的所有迁移记录,不会真实修改业务库数据 - 到
models.py中删除原有独立表的模型代码,给目标模型添加对应的ManyToMany关联字段 - 执行
python manage.py makemigrations <你的应用名>生成新的迁移文件 - 执行
python manage.py migrate <你的应用名>完成迁移即可
注意:如果操作的是带生产数据的线上环境,操作前必须全量备份数据库,避免误操作导致数据丢失
后续正确操作规范
删除模型(数据表)的标准流程
- 直接在
models.py中删除对应模型的代码,不要修改/删除任何已生成的历史迁移文件 - 执行
python manage.py makemigrations,Django会自动生成删除表的迁移记录 - 执行
python manage.py migrate,Django会自动删除数据库中的对应表,同时同步更新迁移历史记录
新增模型属性(字段)的标准流程
- 在
models.py的对应模型中添加字段,若新增非空字段需要提前设置合理的默认值,或者配置null=True允许空值 - 执行
python manage.py makemigrations,自动生成新增字段的迁移记录 - 执行
python manage.py migrate完成字段新增
禁止随意手动修改、删除已生成的迁移文件,除非你同时同步清理了
django_migrations表中对应的迁移记录,否则必然会出现迁移逻辑不一致的各类报错。
内容的提问来源于stack exchange,提问作者user12314098
相关产品推荐
相关产品推荐

