2011-01-14 12 views
4

私は混乱した色です。私たちが南の移行を伴うDjangoプロジェクトを持っていると仮定しましょう。現在、生産プロジェクトのバージョンはA、バージョンはBです。Southのロールバックはどのように動作するはずですか?

  1. は、新しいコード
  2. 実行./manage.py syncdb && ./manage.py migrate
  3. 再起動のWebサーバーをインストールし、幸せになる:それでは、バージョンBが生産にインストールされているとしましょう。

次の前提:バージョンBはまったく機能しません。開発中でしたが、実稼働環境にはありませんでしたので、ロールバックする必要があります。そして、私は何かが欠けているはずです。 2つの可能性があります。

  1. 古いコードが再インストールされています。現在、南のマイグレーションは適切ですが、これは不可能です。これは、古いコードに戻るために必要な最新の移行がすべて含まれていないためです。
  2. 最初にデータベースの変更をロールバックし、古いコードを再インストールします。ただし、バージョンAの最新の移行方法を確認するにはどうすればよいですか? 1つのプロジェクトで数十のアプリが簡単にカウントできるので、それぞれのアプリが古いバージョンに属しているかどうかを把握し、各アプリを別々に移行してからコードをロールバックし、

いずれの場合も、第1のケースの移行コードまたは第2のケースの「移行<->バージョン」関係のいずれかの重要な情報が欠落しています。私はここで何が欠けていますか?

PS:はい、私はバックアップからデータベースを復元できることを知っています、これは私が実際にやっていることです。この全データベース移行理論がロールバックにどのように適合するかを知りたい。

答えて

4

OK。私はあなたがバージョンコントロールで作業していると思いますか?それは、この時点で「A」と「B」を構成するものを決定するためにかなり重要です。私たちが参照しているコードの無作為な塊が「A」であり、これがぼんやりと定義されているすべてのものを「B」とラベル付けして手を振っている/推測している場合、それは機能しません。

あなたは「」「B」の代わりに、次の2つのオプションがあり、再インストールしようとしている場合: 1)チェックアウトをし、最初から「A」を再構築(同期および移行) 2)ロール「B」バックに'A'。

1)DB内のデータを消去して、何も同期させることができないので、うまくいかない可能性があります。 2)移行に関係します。まず、マイグレーションは 'A'ではなく 'B'であるはずです。南では、各アプリのすべての移行に番号が付けられます(0001、0002、0003など)。だから、 'B'が050で、 'A'がat 0031であるとしましょう。 'B'がチェックアウトされている間にpython manage.py migrate appname 0031を実行すると、 'B'のために行ったすべてのDBの変更が取り消されます。あなたのバージョン管理システムでは、 'A'がコミットかタグかブランチかどうかをチェックアウトします。

残念ながら、 'A'にロールバックすることはできません。持っている "。それはより簡単な解決策になりますが、あなたのバージョン管理システムについて知るためには移行システムが必要になります。それは少し毛深いものです。

+0

本質的に、これは私が2番目の可能性として説明したものです。バックアップからデータベースを復元するのが簡単で、おそらくより速いので、多くの手動作業と一連の後方移行作業が敗北します。( –

+1

あなたが必要とするマイグレーションファイルを取得して実行するスクリプトを書いてください。バックアップからのリストアははるかに遅くて、とりわけあなたのDBが成長しているようです。 – JohnO

+1

簡単な解決法は、サウスがテキストファイルリストをここでデータベースは 'pip freeze'のやり方で現時点ではありますが、' ./manage migrate myapp xxxx'のすべてのコマンドを含めることができます。新しいブランチを作成しているときに出力をダンプして保存しますあなたがロールバックしたいときに実行してください。コミット後にファイルに名前を付けることができます。今のところ、 './manage migrat 'の出力を解析するスクリプトを書くことができますe - list'を実行してください。 – tobych

1

あなたのケースではオプションだったのですが、の逆転マイグレーションを実行できなかったのかどうかわからないコードをバージョン 'A'に戻す前に?このようにして、syncdbを実行する前にデータベースが元の状態に戻り、コードをバージョンAに戻して、開始した場所に戻ります。

関連する問題