我错误地删除了路径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。
我该如何恢复所有内容?
我错误地删除了路径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。
我该如何恢复所有内容?
首先,即使这在您的生产环境中发生,也不要惊慌。
当您删除了所有迁移记录时,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_migrations
表中删除引用不存在迁移的任何行。 - GwynBleidD