既にモデルを定義し、manager.py syncdb
を介して関連するデータベースを作成しました。モデルにいくつかのフィールドを追加したので、syncdb
を再試行しましたが、出力は表示されません。テンプレートからこれらの新しいフィールドにアクセスしようとすると、 "No Such Column"例外が発生し、syncdbが実際にデータベースを更新しなかったと思われます。ここで正しいコマンドは何ですか?
Django 1.7+、組み込み 移行サポート の時点で、データを保持するデータベーススキーマの移行が可能になります。おそらく、以下のソリューションよりも優れたアプローチです。
追加のアプリを必要としない別のオプションは、組み込みのmanage.py
関数は、データをエクスポートし、データベースをクリアして、エクスポートされたデータを復元します。
以下のメソッドは、アプリのデータベーステーブルを更新しますが、それらのテーブルに存在するデータを完全に破壊します。アプリモデルに加えた変更が古いスキーマを壊さない場合(たとえば、新しいオプションのフィールドを追加した場合)、次のようにデータをダンプして後で再ロードできます。
python manage.py dumpdata <your_app> > temp_data.json
python manage.py reset <your_app>
python manage.py loaddata temp_data.json
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 などのツールは優れています。
Django 1.7の時点で、ネイティブ移行でこれを行うことができます。
python manage.py makemigrations <your app name>
python manage.py migrate
Djangoのsyncdbはデータベース内の既存のテーブルを変更しないため、手動で行う必要があります。私がいつもやる方法は:
Sqlliteを使用している場合、適切なマネージャーはfirefoxプラグインです。 link
別のツールはDjango evolution。ほとんどの場合、テーブルのドロップは不要です。
他のDjangoアプリとしてインストールして実行してください:
python manage.py evolve --hint --execute
deseb はそのための素晴らしいツールです。
インストールすると、。/ manage.py sqlevolveを記述でき、データベース構造をモデルと同期させるために必要なsqlコマンドが生成されます。
syncdb
でテーブルを再作成する前に、テーブルを削除する必要があります。
既存のデータを保持する場合は、データベースをアンロードし、テーブルを削除し、syncdb
を実行して新しいデータベースを構築し、古いデータを新しいテーブルに再ロードする必要があります。
これを支援するツールがあります。ただし、多くの場合、手動で行うのと同じくらい簡単です。
バージョン1.4.1以降のユーザーの場合、コマンドは次のように変更されました。
python manage.py flush
を使用する前に 公式ドキュメント をお読みください。すべてのデータが削除されます。