删除迁移后 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 中引用不存在的迁移的任何行。
我错误地删除了路径 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 中引用不存在的迁移的任何行。