Djangoのmanage.pyを使用してCLIからデータベースをクリアする最も簡単な方法は何ですか?


83

私はDjangoを使用してMySQLでWebサイトを構築しています。今私が学んでいるので、モデルを頻繁に変更する必要があるので、すべてのテーブルをクリアして新しいテーブルを作成したいと思います。

ただし、syncdb既存のテーブルには触れません。この問題を処理するためのより良い方法はありますか?

回答:


152

データを気にしない場合:

最善の方法は、データベースを削除して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)もお勧めしますが、私はそれを試していません。


4
Southは、移行を自動的に処理するのに非常に適しています。慣れるのに少し時間がかかりますが、開発中にデータベースを削除したり再作成したりする手間が省けます。サイトが稼働し、貴重なデータがあるときにデータベース構造を変更する必要がある場合は必須です。
thepeer 2013年

11
リセットコマンドの減価償却。Django 1.5では、コマンドがに更新されましたflushpython manage.py flushまたはpython manage.py flush --noinputを使用して、インタラクティブプロンプトをスキップしてみてください。
agconti 2013

南は非推奨になりましたこちらをご覧ください。そして、あなたがここで与えたリンクは壊れています。
ムケシュサイクマール

コマンドは現在ドキュメントにdjango-admin flushよると思われます
Todd

4

Django Extensionsを使用して、以下を実行します。

./manage.py reset_db

データベーステーブルをクリアしてから、以下を実行します。

./manage.py syncdb

それらを再作成します(南は物事を移行するように頼むかもしれません)。


2
@beckoはこれを最初に実行します:pip install django-extensions
FacePalm 2017

4

Djangoのドキュメントでは、空のDBから再開することを意図している場合(OPの意図のようです)、データベースを削除して再作成し、migrate(を使用する代わりにflush)再実行することを明示的に述べていると思います。

空のデータベースから開始してすべての移行を再実行する場合は、データベースを削除して再作成してから、代わりに移行を実行する必要があります。

したがって、OPの場合、次のことを行う必要があります。

  1. MySQLからデータベースを削除します
  2. データベースを再作成します
  3. 実行 python manage.py migrate

0

最速(データを含むすべてのテーブルを削除して作成):

./manage.py reset appname | ./manage.py dbshell

注意:

  • Windowsでは正しく動作しない可能性があります。
  • いくつかの古いテーブルをデータベースに保持する可能性があります

3
resetすでにSQLを実行しているため、にパイプする必要はありませんdbshell。このsqlresetコマンドを使用すると、SQLが出力され、シェルにパイプして実行できますが、これは不要な手順です。
Michael Mior 2013年

0

Django-Truncateライブラリを使用すると、テーブル構造を破壊することなく、テーブルのすべてのデータを削除できます。

例:

  1. まず、ターミナル/コマンドラインを使用してdjango-turncateをインストールします。
pip install django-truncate
  1. settings.pyファイルのINSTALLED_APPSに「django_truncate」を追加します。
INSTALLED_APPS = [
    ...
    'django_truncate',
]
  1. ターミナルでこのコマンドを使用して、アプリからテーブルのすべてのデータを削除します。
python manage.py truncate --apps app_name --models table_name
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.