django syncdb y un modelo actualizado

86

Recientemente actualicé mi modelo, le agregué un BooleanField; sin embargo, cuando lo hago python manage.py syncdb, no agrega el nuevo campo a la base de datos del modelo. Cómo puedo arreglar esto ?

Hellnar
fuente
17
El hecho de que Django no admita algo tan fundamental fuera de la caja me impidió usarlo para crear modelos. El hecho de que consideren que un ORM que maneja la creación de tablas pero no la modificación (en el lugar) de la tabla es de calidad de lanzamiento casi me impidió usar Django por completo.
Glenn Maynard
3
El hecho de que Django permita una gran capacidad de conexión de aplicaciones hace que Django sea increíble y hace que su falta de soporte integrado para la modificación de tablas sea básicamente irrelevante. ¿Qué tan difícil es instalar una aplicación?
Dominic Rodger
@Glenn, planifique sus modelos correctamente durante la fase de diseño y no tendrá este problema. Si está agregando nuevas funciones, use una suite de migración como South. Las migraciones in situ suelen ser complicadas; De todos modos, demasiado complicado para un simple comando de administración de Django.
Soviut

Respuestas:

100

Desde Django 1.7 en adelante

Django ha incorporado soporte para migraciones; echa un vistazo a la documentación .

Para Django 1.6 y versiones anteriores

Django no admite migraciones listas para usar. Sin embargo, hay una aplicación conectable para Django que hace exactamente eso y funciona muy bien. Se llama Sur .

Dominic Rodger
fuente
1
Nota: Tuve problemas al usar South para migrar modelos con un backend db personalizado (como django-mssql)
Don
1
¡El sur es muy bonito! Gracias por el consejo
Julien Greard
14

Actualmente, Django no hace esto automáticamente. Tus opciones son:

  1. Elimine la tabla de la base de datos y luego vuelva a crearla en una nueva forma usando syncdb.
  2. Imprima SQL para la base de datos usando python manage.py sql (appname), busque la línea agregada para el campo y agréguela manualmente usando el alter tablecomando SQL. (Esto también le permitirá elegir valores del campo para sus registros actuales).
  3. Use South (según la respuesta de Dominic ).
che
fuente
11

Sigue estos pasos:

  1. Exporte sus datos a un dispositivo usando el comando de administración dumpdata
  2. Deja la mesa
  3. Ejecutar syncdb
  4. Vuelva a cargar sus datos desde el dispositivo usando el comando de administración de carga de datos
Soviut
fuente
¿Una caída y recarga completa para algo que debería hacerse en el lugar? Eso es terrible.
Glenn Maynard
3
Es un comando de administración simple, no una suite de migración. Django no tiene forma de predecir cómo han cambiado sus datos o cómo preservarlos, por lo que insiste en que lo haga usted mismo. Si no le gusta, utilice una herramienta de migración como South.
Soviut
8

Como se sugiere en la respuesta principal, intenté usar South , y después de una hora de frustración con errores de migración oscuros, decidí ir con Django Evolution .

Creo que es más fácil comenzar con South, y funcionó perfectamente la primera vez que escribí ./manage.py evolve --hint --execute, así que estoy contento con eso.

Dan Abramov
fuente
7
Después de haber usado Django Evolution y South durante casi un año, estoy cambiando de opinión. El sur es asombroso. Pero es muy parecido a Git en el sentido de que debes asegurarte de que realmente entiendes cómo funciona . Si está escribiendo comandos a ciegas, lo más probable es que lo arruine la primera vez que usted o alguien de su equipo cometa un error.
Dan Abramov
2

No he usado django por un tiempo, pero creo recordar que syncdb realiza comandos alter en tablas db. tienes que soltar la tabla y luego ejecutar nuevamente y se creará nuevamente.

editar: lo siento NO realiza alteración.

Alex H
fuente
Entonces no está ejecutando alter tablecomandos, está ejecutando create tablecomandos.
Dominic Rodger
Bueno, tengo datos en la base de datos, por lo que sería genial si superara este problema sin caer.
Hellnar
1
Creo que querías decir que syncdb NO realiza comandos de modificación. No tiene que soltar la tabla, también puede agregar manualmente el nuevo campo a su sql.
Odif Yltsaeb
sí, pero la pregunta hacía referencia al uso de syncdb, por lo que en este caso tendría que eliminar la tabla para usar syncdb o usar el complemento que se menciona a continuación.
Alex H
1
Si está frustrado con South, pruebe Django Evolution en su lugar. Funcionó bien para mí. stackoverflow.com/questions/1605662/…
Dan Abramov
1

En django 1.6

  • Al principio hemos corrido - python manage.py sql <app name>

  • Entonces tenemos que correr - python manage.py syncdb

Monwara Hossain Munni
fuente
0

Si ejecuta Django con Apache y MySQL, reinicie Apache después de realizar la migración con makemigrations .

Felipe Perry
fuente