删除迁移后,makemigrations不起作用

Sha*_*awn 2 python django django-migrations

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

0001_initial.py

0011_auto_20150918_0723.py

0002_auto_20150819_1301.py

...

现在,即使我更新了Model文件,并运行该命令python manage.py makemigrations,它始终会在未检测到更改的情况下提示.

我怎样才能恢复一切?

Seb*_*zny 10

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

当您删除所有迁移时,django忘记了此应用程序应该由迁移管理.Django默认返回旧的无python manage.py syncdb迁移行为,并且在您运行时不会尝试检测更改或生成新的迁移python manage.py makemigrations

为了使其了解迁移,您必须专门为您的应用运行该命令:

python manage.py makemigrations appName
Run Code Online (Sandbox Code Playgroud)

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

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

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

python manage.py migrate appName --fake
Run Code Online (Sandbox Code Playgroud)

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

更新(感谢@GwynBleiD):

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

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