2009-03-19 2 views
2

私は使用中の既存のdjangoウェブアプリケーションを持っています。デザイン内の1つの主要モデルを完全に新しいデザインに大幅に移行する必要がありますが、そのモデルのすべての既存データをキャッシュし、展開準備が整うとそのデータを本番環境の新しいレコードに移行します。実稼働環境で急進的なDjangoモデルの移行を行うにはどうすればいいですか?

私は一晩中私のウェブサイトをダウンさせて、私がマイグレーションする必要があるものは何でもすることができます。私はこの移行を行うためのいくつかの元気な方法は何ですか?

任意の移行がする必要がありそうです:新しいフォーマット 3にモデルを移行し、このようなSQL、JSON、XML 2)など、いくつかのフォーマットへの既存データのすべてをダンプ) 1)へのデータのリロード変換スクリプトを使用する新しいモデル

「OldModel」と呼ばれる他のモデル(既存のモデルの名前がModelの場合)に既存のデータをすべて保存してから、データを移行することも考えました。

答えて

4

私が聞いた移行を支援するプロジェクトがあります:South

私はそれを使用していないと認めています。 SQL文のファイルを使用して移行を計画しています。狂気、私は知っているが、それはテスト容易性の利点がある。開発やステージングのテストでは、大規模なデプロイメントの前に、必要な回数実行することができます。ソース制御、差分などが可能です。したがって、大規模なデプロイメントスクリプトから呼び出すこともできます。もちろん、実行前に本番環境をバックアップします:

データベースがジャーナリングを行っている場合、旧式の方法を使用すると、ロールバックできるトランザクション履歴が追加されるという利点があります。

JSON、XML、 "OldModel" - > "NewModel"スタイルのダンプで実行されたテストは、ほとんどスケーリングされていません。あなた、YMMV ...私たちはかなり大きなデータベースを持っています。スクリプトを使用することにより、膨大な量のデータをオフロードまたはリロードすることなく、運用データベース上で実行できます。このように、複雑な移行であっても、数時間ではなく数秒かかることがあります。

+0

そのアプローチが狂気なら、私はあまりにも狂っています! –

+0

私は私たちが話すような移行のために南を使用しています。私はすでに存在するRealEstateListingsアプリをより一般的なListingsアプリ/モデルに移行しています。いくつかの問題を除いて、南は多くの2つの分野を移住させています。 – Rasiel

1

Django ORMが未処理のSQLよりも快適な場合は、Model - > BackupModel - > TestModel - > Modelの使用を検討してください。ここでは、データを破棄せずに最後のステップを除くすべてを実行できます。

def backup(InModel,OutModel): 
    in_objs = InModel.objects.all() 
    for obj in in_objs: 
     out_obj = OutModel.convert_from(InModel,obj) 
     out_obj.save() 

ここでは、すべてのモデルにconvert_fromメソッドが実装されていることを確認します。 BackupModel - > TestModelを除いて、これらはすべて些細な変換でなければなりません。それ以外の場合は、クラスだけが変更され、すべてのデータが同じように保持されます。

これは、すべてのインターフェイスを書き直す前に、TestModelで遊んで、自分の思った通りの変換が行われていることを確認できます。すべてがうまくいかない場合は、BackupModel-> Modelから変換して、すべて正常です。最悪の場合のシナリオでは、DjangoのORMをあきらめてSQLに戻り、backupmodel __ *で始まるすべてのテーブルの名前をデータベースの__ *に変更するだけです。

免責事項:これは決して行っていません。

1

マイグレーションの一部を自動化するのに役立つツールは約5つまたは6つあります。それらのいくつかはthis questionに記載されており、完全性のために他のものを追加します。

次に、テーブルを適切に変換するためのスタンドアロンスクリプトを構成するなど、モデル名にバージョン番号を使用して移行を容易にすることについての素晴らしいアイデアについては、S. Lott'sanswerthis question about migration workflowsを参照してください。私の考えでは、これは、と非常に優れています。は、エクスポートのためにデータをシリアル化してからインポートして新しいテーブルを構築しようとしています。

最後に、私はホットマイグレーションを適切に行う方法については考えていませんでしたが、どこからでもヒントを見なかったので、メンテナンスのダウンタイムは避けられません。

1

すべての移行を段階的に行います。

フィールドを追加する必要がある場合は、デフォルト値またはオプションでフィールドを追加して追加します。これは安全です。 既存のオプションフィールドを必須にする必要がある場合は、最初にデフォルトフィールドを指定します。 既存のフィールドに既定値を持たないようにする必要がある場合は、インスタンスを作成するすべてのコードを修正した後に既定値を削除します。 フィールドのタイプを変更する必要がある場合は、まず現フィールドの値を継承する新しいフィールドを追加します。次に、スクリプトを実行して既存のインスタンスを更新して、新しいフィールドにデータを入力します。第3に、新しいフィールドを使用するために古いフィールドを使用するすべてのコードを削除します。最後に、元のコードは残っておらず、ドロップすることができます。

どのような状況でも、小さなステップがあります。大きな変化のたびに、それを小さなものに分解することができます。これは反復的な開発が報われる場所です。良いバックアップを維持し、頻繁に押すことを恐れないでください!小さな変更をすばやく行い、効果があるかどうかを確認します。

+0

これはジャンゴの進化によってさらに簡単です。 –

関連する問題