2010-12-28 11 views
8

Reescribí muchos de mis modelos, y como solo estoy ejecutando un servidor de prueba, lo hago ./manage.py reinicie myapp para restablecer las tablas de base de datos y todo ha sido funcionando bien.El comando Django: flush no borra completamente la base de datos, el restablecimiento falla

Pero traté de hacerlo esta vez, y me da un error,

"El error completo: contraint owner_id_refs_id_9036cedd" de relación "myapp_tagger" no existe"

así que pensé que solo lo haría Destruir todo el sitio y comenzar de nuevo. Así que lo hice ./manage.py flush, hice un syncdb esto no generó un error y eliminé todos mis datos, sin embargo, no actualicé la base de datos ya que cuando intento acceder a cualquiera de los objetos de my_app , recibí un error de columna no encontrada. Pensé que se suponía que el color dejaba caer todas las tablas. El syncdb dijo que no se agregaron accesorios.

Supongo que el error está relacionado con el hecho de que cambié el modelo de etiquetador por tener una clave externa con un propietario de nombre vinculado a otro objeto.

He intentado agregar nombre_relacionado a los argumentos de la clave externa y nada parece estar funcionando.

+0

Vaya, se perdió la pieza en la que se reinició antes de enjuagar. ignora mi respuesta: P –

Respuesta

13

I thought that flush was supposed to drop all tables.

No. De acuerdo con la documentation, manage.py flush no eliminar las tablas. En su lugar, hace lo siguiente:

Returns the database to the state it was in immediately after syncdb was executed. This means that all data will be removed from the database, any post-synchronization handlers will be re-executed, and the initial_data fixture will be re-installed.

Como se indica en chapter 10 of The Django Book en la sección "Cómo hacer cambios a un esquema de base de datos",

syncdb merely creates tables that don't yet exist in your database — it does not sync changes in models or perform deletions of models. If you add or change a model's field, or if you delete a model, you’ll need to make the change in your database manually.

Por lo tanto, para resolver su problema tendrá que o bien:

  1. Borre la base de datos y vuelva a emitir manage.py syncdb. Este es el proceso que uso cuando todavía estoy desarrollando el esquema de la base de datos. Uso un accesorio initial_data para instalar algunos datos de prueba, que también deben actualizarse cuando cambia el esquema de la base de datos.
  2. Exporte manualmente los comandos SQL para modificar el esquema de su base de datos.
  3. Use South.
+6

+1 re: South. Es realmente increíble poder cambiar el esquema sin perder datos. –

Cuestiones relacionadas