重新运行Django数据迁移

dav*_*ang 33 django django-migrations

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

Ala*_*air 77

在要重新运行的迁移之前假回迁.

./manage.py migrate --fake yourapp 0010_my_previous_data_migration
Run Code Online (Sandbox Code Playgroud)

然后重新运行迁移.

./manage.py migrate yourapp 0011_my_data_migration
Run Code Online (Sandbox Code Playgroud)

然后,您可以伪造回已运行的最新迁移.在你的情况下,你说0011是最新的,所以你可以跳过这个阶段.

./manage.py migrate --fake yourapp 0014_my_latest_data_migration
Run Code Online (Sandbox Code Playgroud)

请注意,根据数据库的状态和迁移的内容,重新运行此类迁移可能会导致错误.请注意有关该选项的文档中的警告--fake:

这适用于高级用户在手动应用更改时直接操作当前迁移状态; 请注意,使用--fake运行会导致将迁移状态表置于需要手动恢复以使迁移正确运行的状态.

  • `./manage.py migrate - 如果是第一次迁移,则将yourapp为零. (6认同)
  • 如果您需要实际查找以前的迁移,另一个有用的命令是“./manage.py showmigrations”。 (2认同)

Jor*_*dan 8

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

您有两个选项可以使此过程安全:

  1. 使您的数据迁移具有幂等性.这意味着任何创建的数据都可以重用(与Model.objects.get_or_create()方法一样)或删除并重新创建.重用是更好的选择,因为删除和重新创建将更改数据库索引和序列.
  2. 进行反向数据迁移.您可以通过传递2个函数来完成此操作migrations.RunPython().例如,如果有migrations.RunPython(add_countries),您可以将其更改migrations.RunPython(add_countries, remove_countries)为第二个函数中的任何相关国家/地区.

如果您选择选项#2,那么您将运行:

./manage.py migrate yourapp 0010_my_previous_data_migration
./manage.py migrate yourapp 0011_my_data_migration
Run Code Online (Sandbox Code Playgroud)

如果你想制作一个衬垫,那么你可以一遍又一遍地使用它:

./manage.py migrate yourapp 0010_my_previous_data_migration && ./manage.py migrate yourapp 0011_my_data_migration
Run Code Online (Sandbox Code Playgroud)