3

重複の可能性:
既存のモデルの変更を反映するようにdjangoデータベースを更新します

私は過去にDjangoを使用しましたが、ORMツールとしてDjangoを使用したときの不満のひとつは、モデルの変更で既存のデータベースを更新できないことです。(Hibernateはこれを非常にうまく実行し、モデルの更新と大幅な変更、および既存のデータベースへの適用を非常に簡単にします。) データベースを毎回ワイプせずにこれを行う方法はありますか?私が遊んでみたいモデルを変更するたびに、管理者ユーザーとサイトを再生成しなければならないのは本当に古くなります。

4

4 に答える 4

9

あなたは南を調べたいと思うでしょう。スキーマの変更とデータの両方をあるバージョンから次のバージョンに移行するための移行システムを提供します。

それは非常に強力であり、変更の大部分は行くことによって簡単に処理することができます

manage.py schemamigration --auto
manage.py migrate

自動機能には制限があります。特に、変更が本番システムで実行される場合は、--auto生成されたコードをチェックして、期待どおりに動作していることを確認する必要があります。

サウスには、始めるための優れたガイドがあり、十分に文書化されています。あなたはそれをhttp://south.aeracode.orgで見つけることができます

于 2011-07-31T23:41:22.260 に答える
1

いいえ。

コマンドのドキュメントにはsyncdb次のように記載されています。

Syncdbは既存のテーブルを変更しません

syncdbは、まだインストールされていないモデルのテーブルのみを作成します。インストール後にモデルクラスに加えられた変更に一致するALTERTABLEステートメントを発行することはありません。モデルクラスとデータベーススキーマへの変更には、多くの場合、何らかの形のあいまいさが含まれます。そのような場合、Djangoは正しい変更を推測する必要があります。その過程で重要なデータが失われるリスクがあります。

モデルに変更を加え、それに合わせてデータベーステーブルを変更する場合は、sqlコマンドを使用して新しいSQL構造を表示し、 それを既存のテーブルスキーマと比較して変更を実行します。

于 2011-07-31T23:11:58.847 に答える
0

ほとんどの人がこの問題を解決する方法はSouthのようですが、これを行うための本当に迅速で簡単な方法は、データベースのインタラクティブシェルを介してデータベースを直接変更することです。dbシェル(通常はdbshell)を起動し、db構文を使用して、変更が必要なフィールドとテーブルを手動で変更、追加、削除するだけです。

manage.py sqlall appname実行して、更新されたテーブルを作成している場合にDjangoが実行するSQLステートメントを確認し、それらを使用して、必要に応じてデータベーステーブルとフィールドを変更することをお勧めします。

Djangoブックのデータベーススキーマセクションに変更を加えるには、これを行う方法の例がいくつかあります:http ://www.djangobook.com/en/1.0/chapter05/

于 2011-08-01T01:12:11.677 に答える
0

私は手動でデータベース(MySQL、PostgreSQLなど)にアクセスしてデータベース情報を変更し、参照用にmodels.pyを調整します。Django Southがあることは知っていますが、別のサードパーティアプリケーションを使用することを気にしたくありませんでした。

于 2011-08-01T01:24:39.580 に答える