回答:
私の知る限り、すべてのテーブルを削除する管理コマンドはありません。Pythonのハッキングを気にしない場合は、独自のカスタムコマンドを記述してそれを行うことができます。このsqlclear
オプションは興味深いかもしれません。ドキュメントには./manage.py sqlclear
、指定されたアプリ名のDROP TABLE SQLステートメントが出力されると記載されています。
更新:この回答の下にある@Mike DeSimoneのコメントを恥知らずに流用して完全な回答を提供します。
./manage.py sqlclear | ./manage.py dbshell
django 1.9の時点で ./manage.py sqlflush
./manage.py sqlclear myAppName | ./manage.py dbshell
すべてのテーブルを削除するネイティブのDjango管理コマンドはありません。どちらsqlclear
とreset
アプリ名が必要です。
ただし、Django Extensionsをインストールして、必要な機能をmanage.py reset_db
正確に実行できます(さらに多くの便利な管理コマンドにアクセスできます)。
manage.py reset_db
、データベースをドロップする前にデータベース接続を閉じるためにフラグ `-c、--close-sessions` もしばしば 必要です(PostgreSQLのみ)
Southパッケージを使用してデータベースの移行を処理する場合(強く推奨)、./manage.py migrate appname zero
コマンドを使用するだけで済みます。
それ以外の場合は、./manage.py dbshell
標準入力でSQLコマンドをパイプインするコマンドをお勧めします。
python manage.py migrate <app> zero
sqlclear
1.9から削除されました。
リリースノートには、移行の導入が原因であると記載されています:https : //docs.djangoproject.com/en/1.9/releases/1.9/
残念ながら、すべてのアプリで一度に機能するメソッドも、インストール済みのすべてのアプリを管理者から一覧表示する組み込みの方法も見つかりませんでした。Djangoでmanage.pyを使用してすべてのインストール済みアプリを一覧表示する方法はありませんか。
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)
データベースを完全にワイプして再同期する場合は、次のようなものが必要です。このコマンドでは、テストデータの追加も組み合わせています。
#!/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 __name__ == "__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
ます。コードを理解できません...
USE DATABASE
私は設定に基づいて意志のオートスイッチは、SQLite3の他のPostgreSQLを切り替えるには管理コマンドとジャンゴ・再作成-DBパッケージを作成することができrecommand。
これが、この問題に対処するためにまとめたシェルスクリプトです。誰かの時間を節約してくれることを願っています。
#!/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
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']])
flushdb
を実行した後、別のコマンドを起動しました。別のスクリプトで必要な場合は、次のように使用できますcall_command
call_command
ます。私はcall_command("flushdb")
前にやるべきだと言ってるのcall_command("syncdb")
?
コマンド./manage.py sqlclear
または./manage.py sqlflush
あなたが完全なデータベースを削除したい場合はしかし、テーブルをクリアし、それらを削除しないように見えるが、これを試してみてくださいmanage.py flush
。
警告: これによりデータベースが完全に削除され、すべてのデータが失われるため、それが重要でない場合は先に進んでみてください。
以下は、複数の設定ファイルを使用していくつかの素晴らしいことを行う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
この回答はpostgresql DB用です:
実行:echo 'drop所有のsome_user ' | ./manage.py dbshell
注:some_userは、データベースへのアクセスに使用するユーザーの名前です。settings.pyファイルを参照してください。
default_database = {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'somedbname',
'USER': 'some_user',
'PASSWORD': 'somepass',
'HOST': 'postgresql',
'PORT': '',
}
これは@ peter-gの回答の南移行バージョンです。私はしばしば生のsqlをいじるので、これは困惑したアプリの0001_initial.pyとして役に立ちます。これは、SHOW TABLES
(mysqlなど)をサポートするDBでのみ機能します。SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';
PostgreSQLを使用する場合のように置き換えます。また、forwards
とbackwards
マイグレーションの両方で、これとまったく同じことをよく行います。
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()))
同僚/コーダーは、私がそうしていることを知っていれば私を殺すでしょう。
すべてのテーブルを削除して再作成します。
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
-「ENGINE設定で指定されたデータベースエンジンのコマンドラインクライアントを実行し、USER、PASSWORDなどの設定で指定された接続パラメーターを使用します」
manage.py syncdb
-「テーブルがまだ作成されていないINSTALLED_APPSのすべてのアプリのデータベーステーブルを作成します」
依存関係:
クレジット:
sqlclearの@Manoj Govindanと@Mike DeSimoneがdbshellにパイプ接続
@sic "s /"; / "CASCADE; /"の@jpic
django-extensionsをインストールし、python manage.py reset_db
コマンドを使用することをお勧めします。それはまさにあなたが望むものを行います。