私はDjangoを使用してMySQLでWebサイトを構築しています。今私が学んでいるので、モデルを頻繁に変更する必要があるので、すべてのテーブルをクリアして新しいテーブルを作成したいと思います。
ただし、syncdb
既存のテーブルには触れません。この問題を処理するためのより良い方法はありますか?
回答:
データを気にしない場合:
最善の方法は、データベースを削除してsyncdb
再実行することです。または、以下を実行できます。
Djangoの場合> = 1.5
python manage.py flush
Django <1.5の場合
python manage.py reset appname
(--no-input
コマンドの最後に追加して、対話型プロンプトをスキップできます。)
データを気にする場合:
ドキュメントから:
syncdbは、まだインストールされていないモデルのテーブルのみを作成します。インストール後にモデルクラスに加えられた変更に一致するALTERTABLEステートメントを発行することはありません。モデルクラスとデータベーススキーマへの変更には、多くの場合、何らかの形のあいまいさが伴います。そのような場合、Djangoは正しい変更を推測する必要があります。その過程で重要なデータが失われるリスクがあります。
モデルに変更を加え、データベーステーブルを変更して一致させる場合は、sqlコマンドを使用して新しいSQL構造を表示し、それを既存のテーブルスキーマと比較して変更を行います。
https://docs.djangoproject.com/en/dev/ref/django-admin/
参照:FAQ- https://docs.djangoproject.com/en/dev/faq/models/#if-i-make-changes-to-a-model-how-do-i-update-the-database
人々はサウス(http://south.aeracode.org/docs/about.html#key-features)もお勧めしますが、私はそれを試していません。
flush
。python manage.py flush
またはpython manage.py flush --noinput
を使用して、インタラクティブプロンプトをスキップしてみてください。
Django Extensionsを使用して、以下を実行します。
./manage.py reset_db
データベーステーブルをクリアしてから、以下を実行します。
./manage.py syncdb
それらを再作成します(南は物事を移行するように頼むかもしれません)。
最速(データを含むすべてのテーブルを削除して作成):
./manage.py reset appname | ./manage.py dbshell
注意:
reset
すでにSQLを実行しているため、にパイプする必要はありませんdbshell
。このsqlreset
コマンドを使用すると、SQLが出力され、シェルにパイプして実行できますが、これは不要な手順です。
Django-Truncateライブラリを使用すると、テーブル構造を破壊することなく、テーブルのすべてのデータを削除できます。
例:
pip install django-truncate
settings.py
ファイルのINSTALLED_APPSに「django_truncate」を追加します。INSTALLED_APPS = [
...
'django_truncate',
]
python manage.py truncate --apps app_name --models table_name