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 관리 명령은 없습니다. 둘 다 sqlclear및 reset앱 이름이 필요합니다.

그러나 원하는 것을 정확히 수행하는 (그리고 더 많은 유용한 관리 명령에 대한 액세스를 제공 하는) 제공하는 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을 사용하는 경우 와 같이 대체하십시오 . 또한 나는 종종 마이그레이션 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()))

하지만 동료 / 코코 더는 내가이 일을했다는 것을 안다면 나를 죽일 것입니다.


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.