私は過去にDjangoを使用しましたが、ORMツールとしてDjangoを使用したときの不満のひとつは、モデルの変更で既存のデータベースを更新できないことです。(Hibernateはこれを非常にうまく実行し、モデルの更新と大幅な変更、および既存のデータベースへの適用を非常に簡単にします。) データベースを毎回ワイプせずにこれを行う方法はありますか?私が遊んでみたいモデルを変更するたびに、管理者ユーザーとサイトを再生成しなければならないのは本当に古くなります。
4 に答える
あなたは南を調べたいと思うでしょう。スキーマの変更とデータの両方をあるバージョンから次のバージョンに移行するための移行システムを提供します。
それは非常に強力であり、変更の大部分は行くことによって簡単に処理することができます
manage.py schemamigration --auto
manage.py migrate
自動機能には制限があります。特に、変更が本番システムで実行される場合は、--auto
生成されたコードをチェックして、期待どおりに動作していることを確認する必要があります。
サウスには、始めるための優れたガイドがあり、十分に文書化されています。あなたはそれをhttp://south.aeracode.orgで見つけることができます
いいえ。
コマンドのドキュメントにはsyncdb
次のように記載されています。
Syncdbは既存のテーブルを変更しません
syncdbは、まだインストールされていないモデルのテーブルのみを作成します。インストール後にモデルクラスに加えられた変更に一致するALTERTABLEステートメントを発行することはありません。モデルクラスとデータベーススキーマへの変更には、多くの場合、何らかの形のあいまいさが含まれます。そのような場合、Djangoは正しい変更を推測する必要があります。その過程で重要なデータが失われるリスクがあります。
モデルに変更を加え、それに合わせてデータベーステーブルを変更する場合は、sqlコマンドを使用して新しいSQL構造を表示し、 それを既存のテーブルスキーマと比較して変更を実行します。
ほとんどの人がこの問題を解決する方法はSouthのようですが、これを行うための本当に迅速で簡単な方法は、データベースのインタラクティブシェルを介してデータベースを直接変更することです。dbシェル(通常はdbshell
)を起動し、db構文を使用して、変更が必要なフィールドとテーブルを手動で変更、追加、削除するだけです。
manage.py sqlall appname
実行して、更新されたテーブルを作成している場合にDjangoが実行するSQLステートメントを確認し、それらを使用して、必要に応じてデータベーステーブルとフィールドを変更することをお勧めします。
Djangoブックのデータベーススキーマセクションに変更を加えるには、これを行う方法の例がいくつかあります:http ://www.djangobook.com/en/1.0/chapter05/
私は手動でデータベース(MySQL、PostgreSQLなど)にアクセスしてデータベース情報を変更し、参照用にmodels.pyを調整します。Django Southがあることは知っていますが、別のサードパーティアプリケーションを使用することを気にしたくありませんでした。