djangosyncdbと更新されたモデル


86

最近モデルを更新し、それにBooleanFieldを追加しましたが、更新しても、モデルpython manage.py syncdbのデータベースに新しいフィールドが追加されません。どうすればこれを修正できますか?


17
Djangoがそのような基本的なものをすぐにサポートしていないという事実により、私はそれを使用してモデルを作成することができませんでした。テーブルの作成を処理するが(インプレースの)テーブルの変更を処理しないORMをリリース品質と見なしているという事実により、私はDjangoを完全に使用できなくなりました。
グレンメイナード

3
Djangoがそのような優れたアプリのプラグイン可能性を可能にするという事実は、Djangoを素晴らしいものにし、テーブル変更の組み込みサポートの欠如を基本的に無関係にします。アプリのインストールはどれくらい難しいですか?
ドミニクロジャー

@Glenn、設計段階でモデルを適切に計画すれば、この問題は発生しません。新しい機能を追加する場合は、Southのような移行スイートを使用してください。インプレース移行はしばしば複雑です。とにかく単純なDjango管理コマンドには複雑すぎます。
ソビウト2009年

回答:


100

Django1.7以降

Djangoには移行のサポートが組み込まれています-ドキュメントをご覧ください

Django1.6以前の場合

Djangoは、すぐに使用できる移行をサポートしていません。それを正確に実行するDjango用のプラグ可能なアプリがあり、それはうまく機能します。それはと呼ばれています。


1
注:カスタムdbバックエンド(django-mssqlなど)を使用してモデルを移行するためにSouthを使用する際に問題が発生しました
Don

1
南はとても素敵です!ヒントをありがとう
Julien Greard 2014

14

Djangoは現在これを自動的に行いません。オプションは次のとおりです。

  1. データベースからテーブルを削除し、syncdbを使用して新しい形式でテーブルを再作成します。
  2. を使用してデータベースのSQLを出力python manage.py sql (appname)し、フィールドに追加された行を見つけて、alter tableSQLコマンドを使用して手動で追加します。(これにより、現在のレコードのフィールドの値を選択することもできます。)
  3. 南を使用します(ドミニクの回答による)。

11

次の手順を実行します:

  1. dumpdata管理コマンドを使用してデータをフィクスチャにエクスポートします
  2. テーブルを落とす
  3. syncdbを実行します
  4. loaddata管理コマンドを使用してフィクスチャからデータをリロードします

インプレースで実行する必要がある何かの完全なドロップとリロード?それはひどい。
グレンメイナード

3
移行スイートではなく、シンプルな管理コマンドです。Djangoには、データがどのように変更されたか、またはデータを保存する方法を予測する方法がないため、自分で行うように要求されます。気に入らない場合は、Southなどの移行ツールを使用してください。
ソビウト2009年

8

トップアンサーで提案されているように、私はSouthを使用してみましたが、不明瞭な移行エラーに対する1時間のフラストレーションの後、代わりにDjangoEvolutionを使用することにしました。

サウスよりも始めやすいと思いますし、最初にタイプしたときは完璧に機能した./manage.py evolve --hint --executeので、満足しています。


7
Django EvolutionとSouthをほぼ1年間使用した後、私は自分の意見を変えています。南は素晴らしいです。しかし、それがどのように機能するかを本当に理解していることを確認する必要があるという意味で、Gitと非常によく似ています。盲目的にコマンドを入力している場合、あなたまたはあなたのチームの誰かが最初に間違いを犯したときに、おそらく失敗するでしょう。
ダンアブラモフ2012

2

Haventはしばらくの間djangoを使用していましたが、syncdbがdbテーブルに対してalterコマンドを実行することを覚えているようです。テーブルを削除してから再度実行する必要があります。そうすると、テーブルが再度作成されます。

編集:申し訳ありませんが変更を実行しません。


次に、alter tableコマンドを実行しているのではなく、create tableコマンドを実行しています。
ドミニクロジャー

私はデータベースにデータを持っているので、ドロップせずにこの問題を克服できれば素晴らしいと思います。
ヘルナー2009年

1
syncdbは変更コマンドを実行しないと言いたかったと思います。テーブルを削除する必要はありません。SQLに新しいフィールドを手動で追加することもできます。
Odif Yltsaeb 2009年

はい。ただし、質問はsyncdbの使用について言及していたため、この場合、syncdbを使用するにはテーブルを削除するか、以下で説明するプラグインを使用する必要があります。
Alex H

1
Southに不満がある場合は、代わりにDjangoEvolutionを試してください。私にとってはうまくいきました。stackoverflow.com/questions/1605662/...
ダン・アブラモフ


0

ApacheとMySQLでDjangoを実行している場合は、makemigrationsで移行を行った後にapacheを再起動します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.