web-dev-qa-db-ja.com

update Django=既存のモデルの変更を反映するデータベース

既にモデルを定義し、manager.py syncdbを介して関連するデータベースを作成しました。モデルにいくつかのフィールドを追加したので、syncdbを再試行しましたが、出力は表示されません。テンプレートからこれらの新しいフィールドにアクセスしようとすると、 "No Such Column"例外が発生し、syncdbが実際にデータベースを更新しなかったと思われます。ここで正しいコマンドは何ですか?

68
theactiveactor

必要なのは移行システムのようです。 は本当にすてきで、うまく機能し、ワークフローを簡単にする自動化ツールを備えています。そして素晴らしい tutorial があります。


注:syncdbは既存のテーブルを更新できません。時々、自動で何をするかを決定することが不可能な場合があります。これが、southスクリプトがこれほど優れている理由です。

33
kender

Django 1.7+、組み込み 移行サポート の時点で、データを保持するデータベーススキーマの移行が可能になります。おそらく、以下のソリューションよりも優れたアプローチです。

追加のアプリを必要としない別のオプションは、組み込みのmanage.py関数は、データをエクスポートし、データベースをクリアして、エクスポートされたデータを復元します。

以下のメソッドは、アプリのデータベーステーブルを更新しますが、それらのテーブルに存在するデータを完全に破壊します。アプリモデルに加えた変更が古いスキーマを壊さない場合(たとえば、新しいオプションのフィールドを追加した場合)、次のようにデータをダンプして後で再ロードできます。

Django 1.4.15およびそれ以前

python manage.py dumpdata <your_app> > temp_data.json
python manage.py reset <your_app>
python manage.py loaddata temp_data.json

Django 1.5以降

python manage.py dumpdata <your_app> > temp_data.json
python manage.py sqlclear <your_app> | python manage.py dbshell
python manage.py syncdb
python manage.py loaddata temp_data.json

resetコマンドは廃止され、 Django 1.5 で削除されました)

変更により古いスキーマが破損した場合、これは機能しません。この場合、 South または Django Evolution などのツールは優れています。

138
zlovelady

Django 1.7の時点で、ネイティブ移行でこれを行うことができます。

python manage.py makemigrations <your app name>
python manage.py migrate
37
Cassidy Laidlaw

Djangoのsyncdbはデータベース内の既存のテーブルを変更しないため、手動で行う必要があります。私がいつもやる方法は:

  1. 最初にモデルクラスを変更します。
  2. 次に、manage.py sql myappを実行します。
  3. 表示されるsqlを見て、これから行う変更をどのように表現しているかを確認します。
  4. データベースマネージャーを使用して手動で変更します。
  5. 管理サイトを使用して、すべてが正常に機能したかどうかを確認します。

Sqlliteを使用している場合、適切なマネージャーはfirefoxプラグインです。 link

9
Juan Besa

別のツールはDjango evolution。ほとんどの場合、テーブルのドロップは不要です。

ジャンゴ進化

他のDjangoアプリとしてインストールして実行してください:

python manage.py evolve --hint --execute

8
Thomas Kremmel

deseb はそのための素晴らしいツールです。

インストールすると、。/ manage.py sqlevolveを記述でき、データベース構造をモデルと同期させるために必要なsqlコマンドが生成されます。

3

syncdbでテーブルを再作成する前に、テーブルを削除する必要があります。

既存のデータを保持する場合は、データベースをアンロードし、テーブルを削除し、syncdbを実行して新しいデータベースを構築し、古いデータを新しいテーブルに再ロードする必要があります。

これを支援するツールがあります。ただし、多くの場合、手動で行うのと同じくらい簡単です。

2
S.Lott

バージョン1.4.1以降のユーザーの場合、コマンドは次のように変更されました。

python manage.py flush

を使用する前に 公式ドキュメント をお読みください。すべてのデータが削除されます

1
akki