web-dev-qa-db-ja.com

Django 1.7で移行をリセットする方法

(これと同じタイトルがあることは知っていますが、質問は異なります)。

開発マシンの移行と本番環境の移行を同期させることができました。

私はDjango Southを使用していたアプリを持っています。私はうまく動作する独自のワークフローを持っていました(おそらく物事を行う正しい方法ではありませんでしたが、問題はありませんでした)。

基本的に、運用データベースのダンプを開発マシンにコピーするスクリプトがあります。また、移行ファイルもコピーしました。このようにして、2つは同期し、通常どおりSouthコマンドを実行できました。

1.7にアップグレードし、移行の使用を開始しました。以前のワークフロー(データベースダンプのコピー、および運用環境からの移行ファイル)を使用すると、開発マシンでの変更が検出されません。

私は移行ドキュメントを読みましたが、それを使用する正しい方法は

  1. 開発マシンで「移行を実行」と「移行」を実行します。
  2. devlopemntマシンで「migrate」を実行して、実際にデータベースを変更します
  3. 移行ファイルを含む変更をコピーします。
  4. 実稼働マシンで「移行」を実行します。 (「makemigrations」ステップなし)

とにかく。今ではすべてが混乱しています。移行を「リセット」し、ゼロから始めて、今後は適切に処理したいと思います。

何をする必要がありますか?

  1. (両方のマシンの)移行テーブルの内容を削除しますか?
  2. 移行フォルダーの内容を削除しますか? (init。pyファイルを含む)。
  3. 新しい移行のドキュメントに従って移行を開始します。

見逃したことがありますか?運用環境(データベースと移行ファイル)からすべてをコピーしても、その後、開発マシンの変更が検出されない理由はありますか

28
wobbily_col

私は両方の環境で次のことをするだけです(コードが同じである限り)

  1. 移行フォルダーを削除する
  2. Django_migrations WHERE app = <your app name>から削除します。または、このテーブルを切り捨てることもできます。
  3. python manage.py makemigrations
  4. python manage.py migrate --fake

この後、環境全体ですべての変更が検出されます。

57
harshil

走る

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つのアプリを作成することをお勧めします。

すべてのモデルに単一のアプリケーションを使用しないでください

29
brunofitas

Harshilの答えの小さなバリエーション:

$ manage.py migrate --fake <appname> zero
$ rm -rf migrations
$ manage.py makemigrations <appname>
$ manage.py migrate --fake <appname>

この意志 ...

  • アプリの実際のテーブルに触れることなく、すべての移行をロールバックするふりをする
  • アプリの既存の移行スクリプトを削除する
  • アプリの新しい初期移行を作成する
  • アプリの初期移行への移行を偽装する
16
rrauenza

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 
1
Ahmed Bouchefra