manage.py 및 명령 줄을 사용하여 데이터베이스에서 모든 테이블을 삭제하려면 어떻게해야합니까? .NET 응용 프로그램에서 실행할 수 있도록 적절한 매개 변수로 manage.py를 실행하는 방법이 있습니까?
답변:
내가 아는 한 모든 테이블을 삭제하는 관리 명령은 없습니다. 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를 사용하여 설치된 모든 앱을 나열하는 방법은 무엇입니까?
파이썬에서 간단한 (?) 방법 (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 패키지를 만들 수 운영자 추천.
다음은이 문제를 처리하기 위해 함께 연결 한 쉘 스크립트입니다. 누군가 시간을 절약하기를 바랍니다.
#!/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 ' 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
- "USER, PASSWORD 등 설정에 지정된 연결 매개 변수를 사용하여 ENGINE 설정에 지정된 데이터베이스 엔진에 대한 명령 행 클라이언트를 실행합니다."
manage.py syncdb
- "테이블이 아직 생성되지 않은 INSTALLED_APPS의 모든 앱에 대한 데이터베이스 테이블 생성"
종속성 :
크레딧 :
@Manoj Govindan 및 @Mike DeSimone for sqlclear를 dbshell로 파이프
@jpic for 'sed "s /"; / "CASCADE; /"'
다른 유형의 manage.py를 위해 Windows 10에서 "python manage.py sqlflush"명령을 사용하십시오.
django-extensions 를 설치 하고 python manage.py reset_db
명령을 사용하는 것이 좋습니다 . 그것은 당신이 원하는 것을 정확하게 수행합니다.