web-dev-qa-db-ja.com

Djangoデータ移行を再実行

Django 1.8+でデータ移行を再実行するにはどうすればよいですか?該当する場合、私の移行には0011_my_data_migration.pyという番号が付けられ、最新の移行です。

32
davidhwang

再実行する移行の前に移行にフェイクバックします。

./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オプションについて:

これは、上級ユーザーが手動で変更を適用する場合、現在の移行状態を直接操作することを目的としています。 --fakeを使用すると、移行状態テーブルが、移行を正常に実行するために手動リカバリが必要になる状態になるリスクがあることに注意してください。

73
Alasdair

Alasdairの回答はこれについて免責事項を提供しますが、移行をi等とすることは、移行がprevious等である場合にのみ安全です。つまり、重複データなどの副作用なしに複数回実行できます。ほとんどの人は移行をこのように記述しませんが、それは良い習慣です。

このプロセスを安全にするための2つのオプションがあります。

  1. データ移行をi等にします。これは、作成されたデータは(Model.objects.get_or_create()メソッドのように)再利用されるか、削除されて再作成されることを意味します。削除と再作成によりデータベースのインデックスとシーケンスが変更されるため、再利用がより良いオプションです。
  2. 逆データ移行を行います。これを行うには、2つの関数をmigrations.RunPython()に渡します。たとえば、migrations.RunPython(add_countries)がある場合、それをmigrations.RunPython(add_countries, remove_countries)に変更し、2番目の関数で関連する国を削除します。

オプション#2を選択した場合、次を実行します。

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

繰り返し使用できるように、1つのライナーにしたい場合:

./manage.py migrate yourapp 0010_my_previous_data_migration && ./manage.py migrate yourapp 0011_my_data_migration
7
Jordan