2010-02-18 18 views
44

Hice un modelo y ejecuté Python manage.py syncdb. Creo que creó una mesa en el db. Luego me di cuenta de que había hecho una columna de forma incorrecta, así que la cambié y ejecuté el mismo comando, pensando que dejaría caer la tabla anterior y agregaría una nueva.¿Cómo elimino una tabla de SQLite3 en DJango?

Luego fui al shell python manage.py, e intenté ejecutar .objects.all(), y falló, diciendo que la columna no existe.

Quiero borrar la tabla anterior, y luego ejecutar syncdb nuevamente, pero no puedo encontrar la manera de hacerlo.

+1

Esto es por diseño. Sincronizar los cambios y las caídas abriría una lata gigante de gusanos. George tiene la respuesta correcta para ti. – Alex

+1

Ofri tiene la mejor respuesta –

Respuesta

38

Otra manera simple de hacer esto durante el uso de Django 1.4 o más adelante, sería

python manage.py reset app_name 

que cae y vuelve a crear las tablas utilizadas por los modelos de esta aplicación.

Esto está desfasada y en Django 1.3 y ya no está disponible en Django 1.5

+0

Esta fue la solución que utilicé. Funcionó perfectamente – Alex

+0

tan feliz que acabo de encontrar esto. gracias – teewuane

+2

"reinicio de comando desconocido" – user798719

26

obtener las instrucciones DROP con

python manage.py sqlclear app_name

luego tratar

python manage.py dbshell

y ejecutar la instrucción DROP

la salida http://docs.djangoproject.com/en/dev/ref/django-admin/

+0

Esta es la respuesta que pensé que estaba por ahí. Gracias. Sucede que el comando de reinicio funcionó bien. – Alex

+0

esto no funciona para SQLite3 ya que no tiene dbshell – rodling

67

para limpiar una aplicación es tan simple como escribir:

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

continuación, con el fin de reconstruir las tablas sólo tiene que escribir:

./manage.py syncdb 
+1

+1 Agradable, funciona muy bien – cevaris

+0

finalmente obtuvo la solución. Gracias – ashim888

+2

Ya no funciona en Django 1.9+: [Deprecations en Django 1.9] (https://docs.djangoproject.com/en/1.9/internals/deprecation/#deprecation-removed-in-1-9) – prokaktus

28

Ninguna de las respuestas muestra cómo eliminar solo una tabla en una aplicación. No es muy difícil. El comando dbshell registra al usuario en el shell sqlite3.

python manage.py dbshell 

Cuando se encuentra en la cáscara, escriba el siguiente comando para ver la estructura de su base de datos. Esto le mostrará todos los nombres de las tablas en la base de datos (y también los nombres de las columnas dentro de las tablas).

SELECT * FROM sqlite_master WHERE type='table'; 

En general, Django nombra las tablas de acuerdo con la siguiente convención: "appname_modelname". Por lo tanto, la consulta SQL que logra su objetivo será similar a la siguiente:

DROP TABLE appname_modelname; 

Esto debería ser suficiente, incluso si la mesa tenía relaciones con otras tablas. Ahora se puede cerrar la sesión de la cáscara SQLITE ejecutando:

.exit 

Si ejecuta syncdb nuevo, Django reconstruir la tabla de acuerdo a su modelo. De esta manera, puede actualizar sus tablas de base de datos sin perder todos los datos de la aplicación. Si te encuentras con este problema mucho, considera usar South: una aplicación django que migrará tus tablas por ti.

+0

TIENE la respuesta más básica a principios básicos a prueba aquí. Solo agregaré que necesitas tener instalado sqlite3. – Arcturus

+0

Muchas gracias por la mención de 'dbshell' - He utilizado' shell' antes, pero después de cambiar mi base de datos para mysql, parece que ya no me permite acceder a mis modelos. El 'dbshell' ahora me conecta directamente a mi shell mysql, muy bueno. – natureminded

+0

De la respuesta de Schdiewie Kay: después de seguir todos los pasos anteriores, ejecute "manage.py migrate --run-syncdb" en lugar de "syncdb" para Django 1.9+ – NFern

15

Tuve el mismo problema.

Para una decisión rápida (si no se preocupan por la pérdida de sus tablas/datos), corrija su archivo models.py con los tipos de datos deseados, eliminar la carpeta y el archivo de migración db.SQLite3,

entonces volver a ejecutar los siguientes comandos:

  1. python manage.py migrar
  2. makemigrations python manage.py
  3. python manage.py migran crea
  4. python manage.py uperuser (para crear un usuario admin/pswd para administrar la página de administración)
  5. python manage.py runserver
+0

Esta fue la única solución que pude obtener para trabajar. ¡Gracias! – Philip

+0

Esta parece ser la única solución de trabajo. Respuesta altamente subestimada –

+0

esta también fue la mejor respuesta para mí, gracias –

1

En Django 1.9 que tenía que hacer los pasos de Kat Russo, pero la segunda migración era un poco complicado. Debe ejecutar

./manage.py migrate --run-syncdb 
+0

esto fue útil – NFern

Cuestiones relacionadas