[mysql] Django에서 manage.py CLI를 사용하여 데이터베이스에서 모든 테이블을 삭제하는 방법은 무엇입니까?

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


답변

모든 테이블을 삭제하는 기본 Django 관리 명령은 없습니다. 둘 다 sqlclearreset앱 이름이 필요합니다.

그러나 원하는 것을 정확히 수행하는 (그리고 더 많은 유용한 관리 명령에 대한 액세스를 제공 하는) 제공하는 Django Extensions 를 설치할 수 있습니다 .manage.py reset_db


답변

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를 사용하여 설치된 모든 앱을 나열하는 방법은 무엇입니까?

관련 : Django 1.7에서 마이그레이션을 재설정하는 방법?


답변

./manage.py sqlflush | ./manage.py dbshellsqlclear 를 사용 하려면 앱을 플러시해야하므로 사용하는 것이 좋습니다 .


답변

파이썬에서 간단한 (?) 방법 (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_commandSQL을 문자열로 반환하는 대신 stdout에 인쇄하는 것이 좋을 것이며 sql_delete코드를 해결할 수 없습니다 …