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


92

manage.py 및 명령 줄을 사용하여 데이터베이스에서 모든 테이블을 삭제하려면 어떻게해야합니까? .NET 응용 프로그램에서 실행할 수 있도록 적절한 매개 변수로 manage.py를 실행하는 방법이 있습니까?

답변:


127

내가 아는 한 모든 테이블을 삭제하는 관리 명령은 없습니다. Python을 해킹해도 괜찮다면 사용자 지정 명령을 작성하여 수행 할 수 있습니다. sqlclear흥미로운 옵션을 찾을 수 있습니다 . 문서에 따르면 ./manage.py sqlclear 주어진 앱 이름에 대한 DROP TABLE SQL 문을 인쇄합니다.

업데이트 : 이 답변 아래에 @Mike DeSimone 의 의견을 뻔뻔 스럽게 적용 하여 완전한 답변을 제공합니다.

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

django 1.9 현재입니다. ./manage.py sqlflush


sqlclear "drop 문을 인쇄"하지만 단일 명령 줄 호출로 실행하는 방법
kmalmur

3
: 당신은 같은 응용 프로그램 이름이 필요./manage.py sqlclear myAppName | ./manage.py dbshell
Montaro

4
이것은 전혀 작동하지 않습니다. sqlclear에는 앱 이름이 필요합니다. 나는 장고 1.8에있어
조나단 하틀리

1
sqlflush는 테이블을 삭제하지 않고 잘립니다. 또한 sqlflush에 의해 생성 된 truncate 명령 끝에 CASCADE 키워드를 추가하지 않는 한이 작업은 postgresql DB에서 작동하지 않을 것입니다.
user3748764

35

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

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


@JulienGreard 업데이트되었습니다. 감사!
Anuj Gupta

3
나는 시도를 포기하고 이것을 사용했습니다.
laffuste 2014-08-29

이것은 나를 위해 일했지만 더 높은 순위의 답변은 없었습니다.
Jonathan Hartley 2015 년

@AnujGupta도 종종 manage.py reset_db데이터베이스를 삭제하기 전에 가까운 데이터베이스 연결에 플래그`-c, --close-sessions`이 필요합니다 (PostgreSQL은 전용)
발레리 Ramusik

34

South 패키지를 사용하여 데이터베이스 마이그레이션을 처리하는 경우 (적극 권장) ./manage.py migrate appname zero명령 만 사용할 수 있습니다 .

그렇지 않으면 ./manage.py dbshell표준 입력에서 SQL 명령을 파이핑 하는 명령을 권장합니다 .


+1. 사소하지 않은 Django 프로젝트는 South를 사용해야합니다. South를 사용하면 Zero로 마이그레이션하는 것은 모든 테이블을 삭제하는 좋은 관용적 방법입니다.
Manoj Govindan 2013 년

사소한 Django 프로젝트조차도 South를 고려해야합니다. 사람들이 데이터베이스 마이그레이션에 익숙해 지도록하기 위해 손으로 데이터를 덤프, 해킹 및 다시로드하거나 고정 장치 메커니즘을 사용하여 데이터를 마이그레이션하는 것과 같은 나쁜 습관을 배우지 않습니다.
Mike DeSimone 2013 년

저는 South를 사용하지만 모든 마이그레이션에 대해 역 마이그레이션을 작성하지 않습니다. 제로 옵션을 사용할 수 있도록 그렇게하지 않겠습니다. 그것이 당신에게 중요하다면 0으로 되돌릴 수 있다는 것을 테스트하는 좋은 방법입니다. 모든 테이블을 삭제하는 것이 합리적입니다.
tobych 2014 년

26

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에서 마이그레이션을 재설정하는 방법?


12

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


7

파이썬에서 간단한 (?) 방법 (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)

5

데이터베이스를 완전히 지우고 동시에 다시 동기화하려면 다음과 같은 것이 필요합니다. 또한이 명령에 테스트 데이터 추가를 결합합니다.

#!/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코드를 해결할 수 없습니다 ...


니스 USE DATABASE나는 sqlite3를 등 PostgreSQL을 사이에 스위치 설정을 기반으로하는 의지 자동 스위치 관리 명령으로 장고 - 재 작성-DB 패키지를 만들 수 운영자 추천.
Natim

4

다음은이 문제를 처리하기 위해 함께 연결 한 쉘 스크립트입니다. 누군가 시간을 절약하기를 바랍니다.

#!/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

1

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']])

제 질문은 데이터베이스가 아직 존재하지 않는 경우 어떻게 수행합니까?
Natim

안타깝게도 동일한 스크립트 (예 : syncdb)에서 추가 작업을 수행하면 "선택된 데이터베이스 없음"오류가 발생합니다.
Timmmm

명령 flushdb을 내리고 다른 명령을 시작한 후에. 다른 스크립트에서 필요한 경우 다음을 사용할 수 있습니다.call_command
Natim

나는 따르지 않는다. 나는 이미 call_command. 내가 call_command("flushdb")전에 해야한다는 말 call_command("syncdb")인가요?
Timmmm

작동하지 않습니다. 같은 오류. 오류는 실행되지 않을 수 있습니다 "어떤 데이터베이스를 선택하지"입니다 어떤 SQL을. 해결책을 찾았습니다. 다른 답변을 참조하십시오.
Timmmm

1

명령 ./manage.py sqlclear또는 ./manage.py sqlflush테이블을 지우고 삭제하지 않는 것처럼 보이지만 전체 데이터베이스를 삭제하려면 다음을 시도하십시오.manage.py flush ..

경고 : 이렇게하면 데이터베이스가 완전히 삭제되고 모든 데이터가 손실되므로 중요하지 않은 경우 시도해보십시오.


2
아니요, 이것은 올바르지 않습니다. flush 및 sqlflush는 동일하며 모든 데이터를 제거하지만 테이블을 삭제하지는 않습니다. sqlflush는 SQL을 표시하지만 실행하지는 않고 flush는 표시하지 않고 실행합니다.
Moulde

1

다음은 여러 설정 파일로 멋진 작업을 수행하는 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


1

이 답변은 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': '',
}

1

psql을 사용 중이고 django-more 2.0.0이 설치되어있는 경우 다음을 수행 할 수 있습니다.

manage.py reset_schema


0

다음은 @ peter-g의 답변의 남쪽 마이그레이션 버전입니다. 나는 종종 원시 SQL을 사용하므로 혼란스러운 앱에 대해 0001_initial.py로 편리합니다. SHOW TABLES(mysql과 같은) 지원하는 DB에서만 작동합니다 . SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';PostgreSQL을 사용하는 경우 와 같이 대체하십시오 . 또한 나는 종종 마이그레이션 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

모든 테이블을 삭제하려는 경우 더 간단한 대답이 있습니다. 데이터베이스가 포함 된 폴더 (mydatabase.db라고도 함)로 이동하여 .db 파일을 마우스 오른쪽 단추로 클릭하고 "삭제"를 누르십시오. 구식 방식으로 작업하기에 확실합니다.


1
하지만 sqlite 데이터베이스에만 해당됩니다 :-)
winwaed

0

모든 테이블을 삭제하고 다시 만듭니다.

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; /"'


0

다른 유형의 manage.py를 위해 Windows 10에서 "python manage.py sqlflush"명령을 사용하십시오.


당신은 무엇을 말하고 싶은가 ??
tannu yadav

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.