web-dev-qa-db-ja.com

Djangoのmanage.py CLIでデータベースからすべてのテーブルを削除するにはどうすればよいですか?

Manage.pyとコマンドラインを使用してデータベースからすべてのテーブルを削除するにはどうすればよいですか?適切なパラメータを使用してmanage.pyを実行する方法はありますか?.NETアプリケーションから実行できますか?

80
kmalmur

私の知る限り、すべてのテーブルを削除する管理コマンドはありません。ハッキングを気にしない場合は、Python独自のカスタムコマンドを記述して、それを行うことができます。sqlclearオプションが興味深いと感じるかもしれません。ドキュメントでは./manage.py sqlclear指定されたアプリ名のDROP TABLE SQLステートメントを出力します。

Update:恥知らずに @ Mike DeSimone のコメントの下に流用して、完全な回答を提供します。

./manage.py sqlclear | ./manage.py dbshell

Django 1.9現在、./manage.py sqlflush

119
Manoj Govindan

Southパッケージを使用してデータベースの移行を処理している場合(強く推奨)、./manage.py migrate appname zeroコマンド。

それ以外の場合は、./manage.py dbshellコマンド、標準入力でのSQLコマンドのパイプ。

34
Mike DeSimone

すべてのテーブルを削除するネイティブのDjango管理コマンドはありません。sqlclearresetの両方にアプリ名が必要です。

ただし、 Django Extensions をインストールできます。これにより、manage.py reset_db、これはまさにあなたが望むことをします(そして 多くの 便利な管理コマンドにアクセスできます)。

30
Anuj Gupta

python manage.py migrate <app> zero

sqlclearは1.9から削除されました。

リリースノートには、移行の導入によるものであることが記載されています: https://docs.djangoproject.com/en/1.9/releases/1.9/

残念ながら、一度にすべてのアプリで機能する方法や、管理者からインストールされたすべてのアプリをリストする組み込みの方法を見つけることができませんでした:

関連: Django 1.7? で移行をリセットする方法

Sqlclearではアプリをフラッシュする必要があるため、./manage.py sqlflush | ./manage.py dbshellを使用することをお勧めします。

12
FeroxTL

python(mysqlで))からそれを行う単純な(?)方法:

from Django.db import connection

cursor = connection.cursor()
cursor.execute('show tables;')
parts = ('DROP TABLE IF EXISTS %s;' % table for (table,) in cursor.fetchall())
sql = 'SET FOREIGN_KEY_CHECKS = 0;\n' + '\n'.join(parts) + 'SET FOREIGN_KEY_CHECKS = 1;\n'
connection.cursor().execute(sql)
6
lemanyk

データベースを完全に消去し、同じ手順で再同期する場合は、次のようなものが必要です。また、このコマンドにテストデータの追加を組み合わせます。

_#!/usr/bin/env python

import os
os.environ.setdefault("Django_SETTINGS_MODULE", "main.settings") # Replace with your app name.

from Django.db import connection
from Django.core.management import call_command
from Django.conf import settings
# If you're using postgres you can't use Django's sql stuff for some reason that I
# can't remember. It has to do with that autocommit thing I think.
# import psychodb2 as db

def recreateDb():
    print("Wiping database")
    dbinfo = settings.DATABASES['default']

    # Postgres version
    #conn = db.connect(Host=dbinfo['Host'], user=dbinfo['USER'],
    #                 password=dbinfo['PASSWORD'], port=int(dbinfo['PORT'] or 5432))
    #conn.autocommit = True
    #cursor = conn.cursor()
    #cursor.execute("DROP DATABASE " + dbinfo['NAME'])
    #cursor.execute("CREATE DATABASE " + dbinfo['NAME'] + " WITH ENCODING 'UTF8'") # Default is UTF8, but can be changed so lets be sure.

    # Mysql version:
    print("Dropping and creating database " + dbinfo['NAME'])
    cursor = connection.cursor()
    cursor.execute("DROP DATABASE " + dbinfo["NAME"] + "; CREATE DATABASE " + dbinfo["NAME"] + "; USE " + dbinfo["NAME"] + ";")
    print("Done")


if __== "__main__":
    recreateDb();
    print("Syncing DB")
    call_command('syncdb', interactive=False)
    print("Adding test data")
    addTestData() # ...
_

cursor.execute(call_command('sqlclear', 'main'))を実行できると便利ですが、_call_command_はSQLを文字列として返すのではなくstdoutに出力し、_sql_delete_コードを解決できません。 ..

4
Timmmm

この問題に対処するために私がつなぎ合わせたシェルスクリプトを次に示します。それが誰かの時間を節約することを願っています。

#!/bin/sh

drop() {
    echo "Droping all tables prefixed with $1_."
    echo
    echo "show tables" | ./manage.py dbshell |
    egrep "^$1_" | xargs -I "@@" echo "DROP TABLE @@;" |
    ./manage.py dbshell
    echo "Tables dropped."
    echo
}

cancel() {
    echo "Cancelling Table Drop."
    echo
}

if [ -z "$1" ]; then
    echo "Please specify a table prefix to drop."
else
    echo "Drop all tables with $1_ prefix?"
    select choice in drop cancel;do
        $choice $1
        break
    done
fi
4
Peter G

コマンド ./manage.py sqlclear または ./manage.py sqlflushはテーブルをクリアし、削除しないようですが、データベース全体を削除したい場合は、これを試してください:manage.py flush

警告:これによりデータベースが完全に削除され、すべてのデータが失われるため、重要でない場合は先に進んで試してください。

1
iyogeshjoshi

この答えはpostgresql DB用です:

実行:echo 'drop owner by some_user' | ./manage.py dbshel​​l

注:some_userは、データベースへのアクセスに使用するユーザーの名前です。settings.pyファイルを参照してください。

default_database = {
    'ENGINE': 'Django.db.backends.postgresql_psycopg2',
    'NAME': 'somedbname',
    'USER': 'some_user',
    'PASSWORD': 'somepass',
    'Host': 'postgresql',
    'PORT': '',
}
1
Kostyantyn

すべてのテーブルを削除して再作成します。

python manage.py sqlclear app1 app2 appN | sed -n "2,$p" | sed -n "$ !p" | sed "s/";/" CASCADE;/" | sed -e "1s/^/BEGIN;/" -e "$s/$/COMMIT;/" | python manage.py dbshell
python manage.py syncdb

説明:

manage.py sqlclear-「指定されたアプリ名のDROP TABLE SQLステートメントを出力します」

sed -n "2,$p"-最初の行を除くすべての行を取得します

sed -n "$ !p"-最終行を除くすべての行を取得します

sed "s/";/" CASCADE;/"-すべてのセミコロン(;)を(CASCADE;)に置き換えます

sed -e "1s/^/BEGIN;/" -e "$s/$/COMMIT;/"-最初のテキストとして挿入(BEGIN;)、最後のテキストとして挿入(COMMIT;)

manage.py dbshell-「USER、PASSWORDなどの設定で指定された接続パラメーターを使用して、ENGINE設定で指定されたデータベースエンジンのコマンドラインクライアントを実行します」

manage.py syncdb-「テーブルがまだ作成されていないINSTALLED_APPSのすべてのアプリのデータベーステーブルを作成します」

依存関係:


クレジット:

@Manoj Govindanと@Mike DeSimoneはsqlclearをdbshel​​lにパイプします

'sed "s /";/"CASCADE; /"'の@jpic

0
Stephen C

windows 10で「python manage.py sqlflush」コマンドを使用して、manage.pyと入力します。

0
tannu yadav

Pythonを使用してflushprojectコマンドを作成するには、次を使用します。

from Django.db import connection
cursor = connection.cursor()
cursor.execute(“DROP DATABASE %s;”, [connection.settings_dict['NAME']])
cursor.execute(“CREATE DATABASE %s;”, [connection.settings_dict['NAME']])
0
Natim

すべてのテーブルを削除する場合は、さらに簡単な答えがあります。データベース(mydatabase.dbと呼ばれることもあります)を含むフォルダーに移動し、.dbファイルを右クリックして「削除」をプッシュします。昔ながらの方法で、確実に機能します。

0
Rock Lee

以下に、複数の設定ファイルでいくつかの素晴らしいことをするMakefileの例を示します。

test:
    python manage.py test --settings=my_project.test

db_drop:
    echo 'DROP DATABASE my_project_development;' | ./manage.py dbshell
    echo 'DROP DATABASE my_project_test;' | ./manage.py dbshell

db_create:
    echo 'CREATE DATABASE my_project_development;' | ./manage.py dbshell
    echo 'CREATE DATABASE my_project_test;' | ./manage.py dbshell

db_migrate:
    python manage.py migrate --settings=my_project.base
    python manage.py migrate --settings=my_project.test

db_reset: db_drop db_create db_migrate

.PHONY: test db_drop db_create db_migrate db_reset

その後、次のようなことができます:$ make db_reset

0
daino3

これが、@ peter-gの回答の南方移行バージョンです。生のSQLをいじることが多いので、これは混乱したアプリにとって0001_initial.pyとして役立ちます。 SHOW TABLES(mysqlなど)をサポートするDBでのみ機能します。 PostgreSQLを使用する場合は、SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';のようなものに置き換えてください。また、forwardsbackwardsの両方の移行について、これとまったく同じことを頻繁に行います。

from south.db import db
from south.v2 import SchemaMigration
from Django.db.utils import DatabaseError
from os import path
from logging import getLogger
logger = getLogger(__name__)


class Migration(SchemaMigration):

    def forwards(self, orm):

        app_name = path.basename(path.split(path.split(path.abspath(__file__))[0])[0])
        table_tuples = db.execute(r"SHOW TABLES;")

        for tt in table_tuples:
            table = tt[0]
            if not table.startswith(app_name + '_'):
                continue
            try:
                logger.warn('Deleting db table %s ...' % table)
                db.delete_table(table)
            except DatabaseError:
                from traceback import format_exc
                logger.error("Error running %s: \n %s" % (repr(self.forwards), format_exc()))

同僚/ココーダーは、私がこれをやったことを知っていれば私を殺すでしょう。

0
hobs