重新运行Django数据迁移

时间:2015-08-11 23:18:40

标签: django django-migrations

如何在Django 1.8+上重新运行数据迁移?如果相关,我的迁移编号为0011_my_data_migration.py,是最新的迁移。

2 个答案:

答案 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的回答给出了关于此的免责声明,但是如果您的迁移是幂等的,那么伪造迁移回到前一个迁移只是安全的,这意味着您可以多次运行它而不会出现重复数据等副作用。大多数人都不会这样写他们的迁移,但这是一种很好的做法。

您可以通过两种方法使此过程安全:

  1. 使您的数据迁移具有幂等性。这意味着任何创建的数据都可以重用(如//add BOM to fix UTF-8 in Excel fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) )); 方法)或删除并重新创建。重用是更好的选择,因为删除和重新创建将改变数据库索引和序列。
  2. 进行反向数据迁移。您可以通过将2个函数传递给Model.objects.get_or_create()来完成此操作。例如,如果您有migrations.RunPython(),则可以将其更改为migrations.RunPython(add_countries)并删除第二个函数中的所有相关国家/地区。
  3. 如果您选择选项#2,那么您将运行:

    migrations.RunPython(add_countries, remove_countries)

    如果你想把它做成一个衬里,那么你可以一遍又一遍地使用它:

    ./manage.py migrate yourapp 0010_my_previous_data_migration
    ./manage.py migrate yourapp 0011_my_data_migration