¿Cuál es la forma más fácil de borrar una base de datos de la CLI con manage.py en Django?

83

Estoy usando Django para crear un sitio web con MySQL. Ahora que estoy aprendiendo, necesito cambiar el modelo muy a menudo, así que quiero que se borren todas las tablas y se cree una nueva tabla.

Pero syncdbno toca las tablas existentes. ¿Existe alguna forma mejor de manejar este problema?

Espejismo
fuente

Respuestas:

152

Si no le importan los datos:

La mejor manera sería eliminar la base de datos y ejecutarla syncdbnuevamente. O puedes ejecutar:

Para Django> = 1.5

python manage.py flush

Para Django <1.5

python manage.py reset appname

(puede agregar --no-inputal final del comando para que se salte el indicador interactivo).

Si te preocupan los datos:

De los documentos:

syncdb solo creará tablas para modelos que aún no se hayan instalado. Nunca emitirá declaraciones ALTER TABLE para que coincida con los cambios realizados en una clase de modelo después de la instalación. Los cambios en las clases de modelo y los esquemas de la base de datos a menudo implican alguna forma de ambigüedad y, en esos casos, Django tendría que adivinar los cambios correctos para realizar. Existe el riesgo de que se pierdan datos críticos en el proceso.

Si ha realizado cambios en un modelo y desea modificar las tablas de la base de datos para que coincidan, use el comando sql para mostrar la nueva estructura SQL y compárela con su esquema de tabla existente para resolver los cambios.

https://docs.djangoproject.com/en/dev/ref/django-admin/

Referencia: Preguntas frecuentes: https://docs.djangoproject.com/en/dev/faq/models/#if-i-make-changes-to-a-model-how-do-i-update-the-database

La gente también recomienda South ( http://south.aeracode.org/docs/about.html#key-features ), pero no lo he probado.

manojlds
fuente
4
South es realmente bueno para manejar migraciones automáticamente. Se necesita un poco de tiempo para acostumbrarse, pero le ahorra muchos problemas al colocar y recrear bases de datos durante el desarrollo, y es imprescindible una vez que su sitio está activo y necesita alterar la estructura de la base de datos mientras tiene datos valiosos en él.
thepeer
11
COMANDO DE RESTABLECIMIENTO DEPRECIADO . En Django 1.5, el comando se ha actualizado a flush. intente usar python manage.py flusho python manage.py flush --noinputpara omitir el mensaje interactivo.
agconti
Sur ha quedado obsoleto . Consulte aquí . Y el enlace que ha proporcionado aquí está roto.
Mukesh Sai Kumar
Parece que el comando ahora está de django-admin flushacuerdo con los documentos
Todd
4

Usando extensiones de Django , ejecutando:

./manage.py reset_db

Limpiará las tablas de la base de datos y luego ejecutará:

./manage.py syncdb

Los recreará (el sur puede pedirle que migre cosas).

mrmagooey
fuente
2
@becko ejecute esto primero: pip install django-extensions
FacePalm
4

Creo que los documentos de Django mencionan explícitamente que si la intención es comenzar desde una base de datos vacía nuevamente (que parece ser la intención de OP), simplemente suelte y vuelva a crear la base de datos y vuelva a ejecutar migrate(en lugar de usar flush):

Si prefiere comenzar desde una base de datos vacía y volver a ejecutar todas las migraciones, debe eliminar y volver a crear la base de datos y luego ejecutar migrate.

Entonces, para el caso de OP, solo necesitamos:

  1. Elimina la base de datos de MySQL
  2. Recrear la base de datos
  3. correr python manage.py migrate
Anupam
fuente
0

Más rápido (elimina y crea todas las tablas, incluidos los datos):

./manage.py reset appname | ./manage.py dbshell

Precaución:

  • Puede que no funcione correctamente en Windows.
  • Podría mantener algunas tablas viejas en la base de datos
Udi
fuente
3
resetya ejecuta SQL, por lo que no es necesario realizar una canalización dbshell. Si usa el sqlresetcomando, entonces solo imprimirá el SQL, que podría canalizar al shell para su ejecución, pero es un paso innecesario.
Michael Mior
0

Puede usar la biblioteca Django-Truncate para eliminar todos los datos de una tabla sin destruir la estructura de la tabla.

Ejemplo:

  1. Primero, instale django-turncate usando su terminal / línea de comando:
pip install django-truncate
  1. Agrega "django_truncate" a tus INSTALLED_APPS en el settings.pyarchivo:
INSTALLED_APPS = [
    ...
    'django_truncate',
]
  1. Utilice este comando en su terminal para eliminar todos los datos de la tabla de la aplicación.
python manage.py truncate --apps app_name --models table_name
Mahbub Ul Islam
fuente