删除迁移后 makemigrations 不起作用

makemigrations does not work after deleting migrations

我错误地删除了路径 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

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

为了让它知道迁移,您必须 运行 专门针对您的应用程序的命令:

python manage.py makemigrations appName

但是,对于您的 运行ning 应用程序,django 将无法检测到新的迁移已经应用到数据库中,并且会在您 运行python manage.py migrate

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

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

python manage.py migrate appName --fake

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

更新(感谢@GwynBleiD):

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

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