Как я могу удалить все таблицы из базы данных с помощью manage.py и командной строки? Есть ли способ сделать это с помощью manage.py с соответствующими параметрами, чтобы я мог выполнить его из приложения .NET?
Как удалить все таблицы из базы данных с помощью manage.py CLI в Django?
Ответ 1
Насколько я знаю, нет команды управления для удаления всех таблиц. Если вы не против взлома Python, вы можете написать свою собственную команду для этого. Вы можете найти вариант sqlclear
интересным. Документация говорит, что ./manage.py sqlclear
Распечатывает SQL-запросы DROP TABLE для имени (-ов) данного приложения.
Обновление: Бесстыдно присвоить @Mike DeSimone комментарий ниже этого ответа, чтобы дать полный ответ.
./manage.py sqlclear | ./manage.py dbshell
Ответ 2
Если вы используете пакет "Юг" для обработки переходов базы данных (настоятельно рекомендуется), вы можете просто использовать команду ./manage.py migrate appname zero
.
В противном случае я бы рекомендовал команду ./manage.py dbshell
, используя команды SQL на стандартном входе.
Ответ 3
Нет никакой команды управления Django, чтобы удалить все таблицы. Для обоих sqlclear
и reset
требуется имя приложения.
Однако вы можете установить Django Extensions, который дает вам manage.py reset_db
, который делает именно то, что вы хотите (и дает вам доступ к еще много полезных команд управления).
Ответ 4
python manage.py migrate <app> zero
sqlclear
был удален из 1.9.
В примечаниях к выпуску упоминается, что это связано с введением миграции: https://docs.djangoproject.com/en/1.9/releases/1.9/
К сожалению, я не смог найти метод, который работает во всех приложениях одновременно, а также встроенный способ перечислить все установленные приложения из admin: Список всех установленных приложений с manage.py в Django?
Связано: Как reset миграции в Django 1.7?
Ответ 5
Лучше использовать ./manage.py sqlflush | ./manage.py dbshell
, потому что sqlclear требует приложения для очистки.
Ответ 6
простой (?) способ сделать это из 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)
Ответ 7
Здесь оболочка script я собралась вместе, чтобы справиться с этой проблемой. Надеюсь, что это кому-то поможет.
#!/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
Ответ 8
Если вы хотите полностью стереть базу данных и выполнить ее повторную синхронизацию, вам потребуется что-то вроде следующего. Я также комбинирую добавление тестовых данных в эту команду:
#!/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 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
...
Ответ 9
Если вы используете Postgres:
echo 'DROP SCHEMA public CASCADE; CREATE SCHEMA public;' | ./manage.py dbshell
Ответ 10
Используя 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']])
Ответ 11
Здесь приведена южная миграционная версия @peter-g.
Я часто играю с сырым sql, так что это пригодится как 0001_initial.py для любых запутанных приложений. Он будет работать только с DB, поддерживающими SHOW TABLES
(например, mysql). Замените что-то вроде 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()))
Кокодеры/кокодеры убили бы меня, если бы знали, что я это сделал.
Ответ 12
Там есть еще более простой ответ, если вы хотите удалить ВСЕ ваши таблицы. Вы просто заходите в свою папку, содержащую базу данных (которую можно назвать mydatabase.db), и щелкните правой кнопкой мыши файл .db и нажмите "удалить". Старомодный способ, уверенность в работе.
Ответ 13
Отбрасывает все таблицы и воссоздает их:
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
- "печатает инструкции SQL DROP TABLE для указанных имен приложений"
sed -n "2,$p"
- захватывает все строки, кроме первой строки
sed -n "$ !p"
- захватывает все строки, кроме последней строки
sed "s/";/" CASCADE;/"
- заменяет все точки с запятой (;) на (CASCADE;)
sed -e "1s/^/BEGIN;/" -e "$s/$/COMMIT;/"
- вставляет (BEGIN;) в качестве первого текста, вставляет (COMMIT;) в качестве последнего текста
manage.py dbshell
- "Запускает клиент командной строки для механизма базы данных, указанного в настройке вашего ДВИГАТЕЛЯ, с параметрами подключения, указанными в настройках ПОЛЬЗОВАТЕЛЯ, ПАРОЛЯ и т.д."
manage.py syncdb
- "Создает таблицы базы данных для всех приложений в INSTALLED_APPS, чьи таблицы еще не созданы"
Зависимости:
- sed, чтобы использовать в Windows, я установил UnxUtils: (Загрузить) (Инструкции по установке)
Кредиты:
@Manoj Govindan и @Mike DeSimone для sqlclear подключены к dbshell
@jpic для 'sed' s/ ";/" CASCADE;/"'
Ответ 14
Команда ./manage.py sqlclear
или ./manage.py sqlflush
, похоже, очищает таблицу и не удаляет ее, однако если вы хотите удалить полную базу данных, попробуйте это: manage.py flush
.
Предупреждение: это полностью удалит вашу базу данных, и вы потеряете все свои данные, поэтому, если это не важно, попробуйте.
Ответ 15
Вот пример 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