Как удалить все таблицы из базы данных с помощью manage.py CLI в Django? - PullRequest
80 голосов
/ 05 августа 2010

Как я могу удалить все таблицы из базы данных, используя manage.py и командную строку?Есть ли способ сделать это, запустив manage.py с соответствующими параметрами, чтобы я мог выполнить его из приложения .NET?

Ответы [ 16 ]

119 голосов
/ 05 августа 2010

Насколько я знаю, нет команды управления для удаления всех таблиц.Если вы не против взлома Python, вы можете написать собственную команду для этого.Вам может показаться интересным вариант sqlclear.В документации сказано, что ./manage.py sqlclear Печатает операторы SQL DROP TABLE для заданных имен приложений.

Обновление : беззастенчиво присваивает @ Mike DeSimone *Комментарий 1010 * ниже этого ответа дает полный ответ.

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

Начиная с django 1.9, теперь это ./manage.py sqlflush

33 голосов
/ 05 августа 2010

Если вы используете пакет South для обработки миграции базы данных (настоятельно рекомендуется), то вы можете просто использовать команду ./manage.py migrate appname zero.

В противном случае, я бы порекомендовал команду ./manage.py dbshell, pipingв командах SQL на стандартный ввод.

29 голосов
/ 15 октября 2012

Нет встроенной команды управления Django для удаления всех таблиц. Для sqlclear и reset требуется имя приложения.

Однако вы можете установить Django Extensions , который дает вам manage.py reset_db, который делает именно то, что вам нужно (и дает вам доступ к многим * полезным командам управления).

21 голосов

python manage.py migrate <app> zero

sqlclear удалено из 1.9.

В примечаниях к выпуску упоминается, что это связано с введением миграций: https://docs.djangoproject.com/en/1.9/releases/1.9/

К сожалению, я не смог найти ни метод, который работает на всех приложениях одновременно, ни встроенный способ вывести список всех установленных приложений от администратора: Как вывести список всех установленных приложений с manage.py в Django?

Похожие: Как сбросить миграции в Django 1.7?

12 голосов
/ 16 февраля 2015

Лучше использовать ./manage.py sqlflush | ./manage.py dbshell, потому что sqlclear требует приложения для сброса.

6 голосов
/ 28 января 2013

простой (?) Способ сделать это из 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)
4 голосов
/ 10 октября 2012

Если вы хотите полностью стереть базу данных и выполнить ее повторную синхронизацию, вам нужно что-то вроде следующего.Я также комбинирую добавление тестовых данных в эту команду:

#!/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-код на стандартный вывод, а не возвращает его в виде строки, и яне могу отработать sql_delete код ...

4 голосов
/ 22 сентября 2011

Вот сценарий оболочки, который я собрал вместе, чтобы справиться с этой проблемой. Надеюсь, это сэкономит кому-то время.

#!/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 голос
/ 10 сентября 2018

Этот ответ для DB postgresql:

Пробег: 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': '',
}
1 голос
/ 18 апреля 2016

Команда ./manage.py sqlclear или ./manage.py sqlflush, кажется, очищает таблицу и не удаляет их, однако, если вы хотите удалить всю базу данных, попробуйте следующее: manage.py flush.

Предупреждение: это полностью удалит вашу базу данных, и вы потеряете все ваши данные, поэтому, если это не важно, попробуйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...