(これと同じタイトルがあることは知っていますが、質問は異なります)。
開発マシンの移行と本番環境の移行を同期させることができました。
私はDjango Southを使用していたアプリを持っています。私はうまく動作する独自のワークフローを持っていました(おそらく物事を行う正しい方法ではありませんでしたが、問題はありませんでした)。
基本的に、運用データベースのダンプを開発マシンにコピーするスクリプトがあります。また、移行ファイルもコピーしました。このようにして、2つは同期し、通常どおりSouthコマンドを実行できました。
1.7にアップグレードし、移行の使用を開始しました。以前のワークフロー(データベースダンプのコピー、および運用環境からの移行ファイル)を使用すると、開発マシンでの変更が検出されません。
私は移行ドキュメントを読みましたが、それを使用する正しい方法は
とにかく。今ではすべてが混乱しています。移行を「リセット」し、ゼロから始めて、今後は適切に処理したいと思います。
何をする必要がありますか?
見逃したことがありますか?運用環境(データベースと移行ファイル)からすべてをコピーしても、その後、開発マシンの変更が検出されない理由はありますか
私は両方の環境で次のことをするだけです(コードが同じである限り)
<your app name>
から削除します。または、このテーブルを切り捨てることもできます。python manage.py makemigrations
python manage.py migrate --fake
この後、環境全体ですべての変更が検出されます。
走る
python manage.py migrate your_app zero
これにより、your_appからすべてのテーブルが削除されます
必要に応じて、最初からやり直したいと言ったので、移行フォルダーを削除するか、フォルダーの名前を変更し、新しい移行フォルダーを作成して実行することができます
python manage.py makemigrations your_app
python manage.py migrate your_app
南と同じように、いつでも行き来できます...
# Go to the first migration
python manage.py migrate your_app 0001
# Go to the third migration
python manage.py migrate your_app 0003
4番目の移行が混乱していると想像してください。いつでも3番目に移行し、4番目の移行ファイルを削除して、もう一度実行できます。
注:
これが、モデルを異なるアプリに配置する必要がある理由の1つです。 2つのモデルがあるとしましょう:ユーザーとメモ。移行が互いに独立しているように、ユーザーとメモの2つのアプリを作成することをお勧めします。
すべてのモデルに単一のアプリケーションを使用しないでください
Harshilの答えの小さなバリエーション:
$ manage.py migrate --fake <appname> zero
$ rm -rf migrations
$ manage.py makemigrations <appname>
$ manage.py migrate --fake <appname>
この意志 ...
1)
PosgresやMySQLなどのデータベースシステムを使用していて、mydbという名前のデータベースがある場合は、SQL言語を使用してデータベースを削除することから始めます
delete mydb;
2)
次に、プロジェクトに属する各アプリのすべての移行フォルダーを調べて、init.pyを除く移行ファイルを削除する必要があります
Linux/MACでターミナルを使用している場合は、この退屈な簡単に自動化できます。たとえば、
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc" -delete
3)
Djangoを使用してモデルを新しいデータベースに同期するときに通常呼び出す2つの移行コマンドを実行するだけです。
python manage.py makemigrations
python manage.py migrate
Sqlite以外のデータベースシステムを使用している場合は、古いデータベースを削除した後、新しいデータベースを作成してください。
データベースを削除できないためにアプリが実稼働している場合、この場合の移行をリセットするにはどうすればよいですか?
移行履歴を削除する間、データベースを保持するだけです。詳細な手順でこれを行う方法は次のとおりです。
1)
最初に各アプリを調べ、次のコマンドを発行して移行履歴を決定します
python manage.py migrate --fake myApp zero
Djangoは、特定のアプリ(myApp)の以前の移行をすべて解除します
2)
次に、移行ファイルを実際に削除する必要があるため、各アプリの移行フォルダーをもう一度確認し、init.pyを除いてそれらを削除する必要があります。Unixベースのオペレーティングシステムでは、次のスクリプトを使用するだけです。コマンドライン。Unixに似ているはずですが、誠に私はWindowsとnetier power bashを使用しません
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc" -delete
次を使用して、移行を簡単に確認できます。
python manage.py showmigrations
3)
次に、移行を再度作成する必要があるため、実行するだけです
python manage.py makemigrations
ただし、データベースにはまだ初期移行に属するテーブルが残っていることを忘れないでください。データベースを移行し、同時に初期移行を偽装するだけで、実行することができます。
python manage.py migrate --fake-initial