web-dev-qa-db-ja.com

--fake-initialと--fake in Django migration?

違いは何ですか --fake-initialおよび--fake in Django=移行?偽の移行を使用することの危険性は?誰でも知っていますか?どうもありがとうございました。

私はDjango 1.10を使用しています

22
yooth

さて、ドキュメントはこれについて非常に明確です

-偽の初期

Django=は、その移行のすべてのCreateModel操作によって作成されたすべてのモデルの名前を持つすべてのデータベーステーブルが既に存在する場合、アプリの初期移行をスキップします。このオプションは、ただし、このオプションは、一致するテーブル名を超えて一致するデータベーススキーマをチェックしません。

あなたはリスクについて尋ねていました、よくここにあります

既存のスキーマが初期移行で記録されたものと一致すると確信している場合にのみ安全に使用できます。

- 偽

Django=に、移行を適用済みまたは未適用としてマークしますが、データベーススキーマを変更するために実際にSQLを実行することはありません。

これは、上級ユーザーが手動で変更を適用する場合、現在の移行状態を直接操作することを目的としています。

もう一度リスクが明確に強調されています

--fakeを使用すると、移行状態テーブルが、移行を正常に実行するために手動リカバリが必要になる状態になるリスクがあることに注意してください。

この回答は、Djangoバージョン1.8+だけでなく、他のバージョンでも有効です。

編集2018年11月:私は時々、ここや他の場所で、データベースを削除するように提案する回答を見ます。それは正しいことではありません。データベースを削除すると、すべてのデータが失われます。

32
e4c5

@ e4c5はすでにこの質問について答えを出していますが、--fakeおよび--fake-initial

本番のデータベースがあり、それを開発に使用し、データを破壊せずに移行を適用するとします。その場合は--fake-initialが便利です。

--fake-initialは、強制的にDjangoに移行ファイルを確認させ、基本的にデータベースに既に存在するテーブルの作成をスキップします。ただし、テーブルを作成しない移行は、むしろ既存のテーブルを変更する)が実行されます。

逆に、移行ファイルがある既存のプロジェクトがあり、既存の移行の履歴をリセットする場合は、--fakeが通常使用されます。

5
Shubho Shaha

短い答え

  • --fakeしない移行を適用する
  • --fake-initial可能性あり、または可能性なし移行の適用

より長い答え:

--fake:DjangoはDjango_migrationsと呼ばれるテーブルを保持して、過去にどの移行を適用したかを把握し、誤って再度適用しないようにします。すべて--fakeは、そのテーブルに移行ファイル名を挿入します実際に実行せずに移行。これは、データベーススキーマを最初に手動で変更し、後でモデルを変更し、Djangoのアクションをバイパスする場合に便利です。そのステップの間、あなたは自分でいるので、一貫性のない状態に陥らないように注意してください。

--fake-initial:データベースの状態に依存

  • すべてのテーブルはデータベースに既に存在します。その場合、--fakeのように機能します。 テーブルの実際のスキーマではなく、名前のみがチェックされるため、再度注意してください
  • いずれのテーブルもデータベースに既に存在します:その場合、通常の移行のように動作します
  • テーブルの一部はすでに存在します:エラーが発生します。データベースを管理するか、Djangoを実行します。

--fake-initialは、移行ファイルのクラスにinitial=Trueがある場合にのみ考慮されることに注意してください。そうでない場合、フラグは無視されます。また、これは、移行におけるinitial=Trueの唯一の文書化された使用法です。

2
blue_note