una todos todas tablas los las eliminar datos borrar mysql django django-admin

mysql - todos - ¿Cómo eliminar todas las tablas de la base de datos con manage.py CLI en Django?



django base de datos (14)

¿Cómo puedo eliminar todas las tablas de una base de datos usando manage.py y la línea de comandos? ¿Hay alguna forma de hacerlo ejecutando manage.py con los parámetros adecuados para poder ejecutarlo desde una aplicación .NET?


Aquí hay un ejemplo de Makefile para hacer algunas cosas agradables con múltiples archivos de configuración:

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

Entonces puedes hacer cosas como: $ make db_reset


Aquí hay un script de shell que terminé reconstruyendo para tratar este problema. Espero que le ahorre a alguien algo de tiempo.

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


Aquí hay una versión de migración al sur de la respuesta de @ peter-g. A menudo juego con raw sql, así que esto es útil como 0001_initial.py para cualquier aplicación desconcertante. Solo funcionará en DB que admitan SHOW TABLES (como mysql). Sustituya algo como SELECT table_name FROM information_schema.tables WHERE table_schema = ''public''; si usa PostgreSQL. Además, a menudo hago exactamente lo mismo para las migraciones backwards forwards y 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()))

Sin embargo, los compañeros de trabajo / capullos me matarían si supieran que hice esto.


El comando ./manage.py sqlclear o ./manage.py sqlflush parece borrar la tabla y no eliminarlos; sin embargo, si desea eliminar la base de datos completa, intente esto: manage.py flush .

Advertencia: esto borrará completamente su base de datos y perderá todos sus datos, por lo que si no es importante, intentelo.


Es mejor usar ./manage.py sqlflush | ./manage.py dbshell ./manage.py sqlflush | ./manage.py dbshell porque sqlclear requiere que la aplicación se descargue.


Hay una respuesta aún más simple si desea eliminar TODAS sus tablas. Simplemente vaya a su carpeta que contiene la base de datos (que puede llamarse mydatabase.db) y haga clic con el botón derecho en el archivo .db y presione "eliminar". Manera antigua, seguro de trabajar.


No existe un comando de administración nativo de Django para descartar todas las tablas. Ambos, sqlclear y reset requieren un nombre de aplicación.

Sin embargo, puede instalar Extensiones Django que le proporciona manage.py reset_db , que hace exactamente lo que desea (y le da acceso a muchos más comandos de administración útiles).


Si desea borrar completamente la base de datos y volver a sincronizarla en el mismo proceso, necesita algo como lo siguiente. También combino agregar datos de prueba en este comando:

#!/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() # ...

Sería bueno poder hacer cursor.execute(call_command(''sqlclear'', ''main'')) pero call_command imprime el SQL en stdout en lugar de devolverlo como una cadena, y no puedo calcular el código sql_delete . ..


Si está usando el paquete South para manejar las migraciones de la base de datos (altamente recomendado), entonces podría simplemente usar el ./manage.py migrate appname zero .

De lo contrario, recomendaría el comando ./manage.py dbshell , canalizando los comandos SQL en la entrada estándar.


Suelta todas las tablas y las recrea:

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

Explicación:

manage.py sqlclear - "imprime las sentencias SQL DROP TABLE para el (los) nombre (s) de la aplicación dada (s)"

sed -n "2,$p" - toma todas las líneas excepto la primera línea

sed -n "$ !p" - toma todas las líneas excepto la última línea

sed "s/";/" CASCADE;/" - reemplaza todos los puntos y comas (;) con (CASCADE;)

sed -e "1s/^/BEGIN;/" -e "$s/$/COMMIT;/" - inserta (BEGIN;) como primer texto, inserta (COMMIT;) como último texto

manage.py dbshell - "Ejecuta el cliente de línea de comandos para el motor de base de datos especificado en la configuración ENGINE, con los parámetros de conexión especificados en su configuración de USER, PASSWORD, etc."

manage.py syncdb - "Crea las tablas de la base de datos para todas las aplicaciones en INSTALLED_APPS cuyas tablas aún no se han creado"

Dependencias:

Créditos:

@Manoj Govindan y @Mike DeSimone para sqlclear canalizados a dbshell

@jpic para ''sed'' s / "; /" CASCADE; / "''


Usando Python para hacer un comando flushproject, usas:

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


forma simple (?) de hacerlo desde python (en 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)


python manage.py migrate <app> zero

sqlclear fue eliminado de 1.9.

Las notas de la versión mencionan que se debe a la introducción de migraciones: https://docs.djangoproject.com/en/1.9/releases/1.9/

Lamentablemente, no pude encontrar un método que funciona en todas las aplicaciones a la vez, ni una forma incorporada de listar todas las aplicaciones instaladas desde el administrador: ¿Cómo enumerar todas las aplicaciones instaladas con manage.py en Django?

Relacionado: ¿Cómo reiniciar las migraciones en Django 1.7?


Por lo que sé, no hay un comando de administración para eliminar todas las tablas. Si no te importa piratear Python, puedes escribir tu propio comando personalizado para hacerlo. Puede encontrar interesante la opción sqlclear . La documentación dice que ./manage.py sqlclear Imprime las sentencias SQL de DROP TABLE para el (los) nombre (s) de aplicación proporcionados.

Actualización : apropiarse desvergonzadamente del comentario de @Mike DeSimone debajo de esta respuesta para dar una respuesta completa.

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