删除迁移后,makemigrations不起作用

时间:2015-10-27 15:22:51

标签: python django django-migrations

我错误地删除了路径 projectName / appName / migrations 下的所有 .py 文件,其中包括:

  

0001_initial.py

     

0011_auto_20150918_0723.py

     

0002_auto_20150819_1301.py

     

...

现在,即使我更新了模型文件,并运行命令python manage.py makemigrations,也始终会提示未检测到更改

如何恢复所有内容?

1 个答案:

答案 0 :(得分:10)

首先,即使生产中发生了这种情况也不要惊慌

当您删除所有迁移时,django忘记了此应用程序应由迁移管理。 Django默认返回遗留python manage.py syncdb无迁移行为,并且在您运行python manage.py makemigrations

时不会尝试检测更改或生成新的迁移

为了让它了解迁移,您必须专门为您的应用运行命令:

python manage.py makemigrations appName

但是,对于正在运行的应用程序,django将无法检测到新的迁移已在数据库中应用,并且在您运行python manage.py migrate时将尝试再次运行它们。

发生这种情况时,迁移失败,说relation appName.XYZ already exists!

为了让django明白您的迁移已经反映在数据库中,您必须伪造它们:

python manage.py migrate appName --fake

这将更新迁移历史记录表并将迁移标记为已应用,但不会尝试在数据库中创建表。

更新(感谢@GwynBleiD):

此处的一个问题是已删除的已迁移的迁移将列在数据库的迁移历史记录表中。对于初始python manage.py makemigrations myApp,这不会是一个问题,但对于任何其他迁移,它都会引发有关inconsistent migration history的错误。

为避免这种情况,您必须手动删除数据库中引用不存在的迁移的django_migrations表中的任何行。