删除迁移文件后,makemigrations命令无法使用

3

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

0001_initial.py

0011_auto_20150918_0723.py

0002_auto_20150819_1301.py

...

现在,即使我更新了Model文件,并运行命令python manage.py makemigrations,它总是提示No changes detected

我该如何恢复所有内容?

1个回答

12

首先,即使这在您的生产环境中发生也不要惊慌。

当您删除了所有迁移记录时,Django遗忘了该应用程序应由迁移管理。Django会回到传统的python manage.py syncdb无需迁移的行为,并在运行python manage.py makemigrations时不会尝试检测更改或生成新的迁移记录。

为了让Django意识到迁移记录,您需要针对您的应用程序运行特定命令:

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,这不会成为问题,但对于任何其他迁移,它将引发有关不一致的迁移历史记录的错误。

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


这里的一个问题是:如果已经应用了删除的迁移,它们将在数据库中的迁移历史表中列出 - 对于初始迁移来说这不是问题,Django会忽略它,但对于任何其他迁移,它将抛出关于不一致的迁移历史的错误。为了避免这种情况,您必须手动从数据库中的django_migrations表中删除引用不存在迁移的任何行。 - GwynBleidD
我不建议对于没有经验的用户使用虚假运行,因为它需要手动恢复。从文档中可以看到: “这是为高级用户设计的,用于直接操作当前迁移状态,如果他们正在手动应用更改;请注意,使用--fake会有将迁移状态表置于一种状态的风险,在该状态下需要手动恢复才能使迁移正确运行。” - ikonuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接