如何在Django 1.8+上重新运行数据迁移?如果相关,我的迁移编号为0011_my_data_migration.py,是最新的迁移。
答案 0 :(得分:67)
在您要重新运行的迁移之前假回迁。
./manage.py migrate --fake yourapp 0010_my_previous_data_migration
然后重新运行迁移。
./manage.py migrate yourapp 0011_my_data_migration
然后,您可以伪造回已运行的最新迁移。在你的情况下,你说0011是最新的,所以你可以跳过这个阶段。
./manage.py migrate --fake yourapp 0014_my_latest_data_migration
请注意,根据数据库的状态和迁移的内容,重新运行此类迁移可能会导致错误。请注意关于--fake
选项的警告in the docs:
这适用于高级用户在手动应用更改时直接操作当前迁移状态;请注意,使用
--fake
会导致将迁移状态表置于需要手动恢复以使迁移正常运行的状态。
答案 1 :(得分:6)
Alasdair的回答给出了关于此的免责声明,但是如果您的迁移是幂等的,那么伪造迁移回到前一个迁移只是安全的,这意味着您可以多次运行它而不会出现重复数据等副作用。大多数人都不会这样写他们的迁移,但这是一种很好的做法。
您可以通过两种方法使此过程安全:
//add BOM to fix UTF-8 in Excel
fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) ));
方法)或删除并重新创建。重用是更好的选择,因为删除和重新创建将改变数据库索引和序列。Model.objects.get_or_create()
来完成此操作。例如,如果您有migrations.RunPython()
,则可以将其更改为migrations.RunPython(add_countries)
并删除第二个函数中的所有相关国家/地区。如果您选择选项#2,那么您将运行:
migrations.RunPython(add_countries, remove_countries)
如果你想把它做成一个衬里,那么你可以一遍又一遍地使用它:
./manage.py migrate yourapp 0010_my_previous_data_migration
./manage.py migrate yourapp 0011_my_data_migration