Django添加应用初始迁移时InconsistentMigrationHistory错误的解决办法
问题解决方案
背景情况
该应用已在多个国家的生产环境中运行,最初所有模型都设置了managed=False。
后续claim_batch应用生成了0002_capitationpayment迁移文件,依赖配置如下:
dependencies = [ ('product', '__first__'), ('claim_batch', '0001_initial'), ] # 部分模型包含指向 "product.Product" 的外键
此时product模块仅包含模型,没有迁移文件,执行showmigrations命令的输出如下:
product (no migrations)
该阶段系统可以正常运行。
问题触发
后续需要为product中的受管理表添加迁移文件,执行makemigrations后尝试运行migrate时出现如下报错:
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration claim_batch.0002_capitationpayment is applied before its dependency product.0001_initial on database 'default'.
报错逻辑符合Django迁移规则:claim_batch.0002迁移引用了后续新增的product迁移,按规则依赖迁移的执行时间不能晚于依赖它的迁移,仅当前场景属于特殊历史遗留情况。
如果尝试从已执行的迁移中移除该依赖项,会触发新的报错:
ValueError: The field claim_batch.CapitationPayment.product was declared with a lazy reference to 'product.product', but app 'product' isn't installed.
全新安装场景下这套逻辑可以正常运行,但多套已上线的生产环境已经处于上述遗留状态,完全重新搭建不具备可行性。
可行解决方法
手动将product应用的初始迁移记录添加到django_migrations表中即可解决问题,该方案虽然不是最优解,但具备可操作性,适合生产环境快速修复。
内容的提问来源于stack exchange,提问作者Eric Darchis
相关产品推荐
相关产品推荐

