Migración hacia atrás con Django South

217

Ok, parece una pregunta realmente tonta, y estoy seguro de que me falta algo en alguna parte.

¿Cómo se realiza una migración hacia atrás usando South en Django?

Así que modifiqué mis modelos, creé una migración con schemamigration, ejecuté la migración con migrate, y ahora me doy cuenta de que eso no es exactamente lo que quería y lo quiero como antes.

A falta de editar manualmente tablas de db y eliminar archivos de migración, ¿cómo debo hacer para revertir la migración? Encuentro referencias a migraciones hacia atrás usando South a través de Google, pero aún no he encontrado un ejemplo de código sólido para ello.

¿Alguien puede ayudar?

Ruiwen
fuente
¡¡buena pregunta!!
Marshall X

Respuestas:

335

Debe calcular el número de la migración justo antes de la que desea revertir.

Su aplicación debe tener un directorio de migraciones, con archivos que se denominen como

0000_initial.py
0001_added_some_fields.py
0002_added_some_more_fields.py
0003_deleted_some_stuff.py

Normalmente, cuando ejecuta ./manage.py migrate your_app, South ejecuta todas las migraciones nuevas, en orden. (Mira las tablas de la base de datos para decidir cuáles son 'nuevas').

Sin embargo, también puede especificar cualquier migración por número, y South migrará su base de datos, ya sea hacia adelante o hacia atrás , para llevarla a ese punto. Entonces, con los archivos de ejemplo anteriores, si ya ha migrado hasta 0003 y desea ejecutar 0003 en reversa (deshaciéndolo, efectivamente), ejecutará

./manage.py migrate your_app 0002

South miraría la base de datos, se daría cuenta de que ya ha ejecutado 0003 y determinaría que debe ejecutar la migración inversa para 0003 para volver a 0002.

Ian Clelland
fuente
1
Desafortunadamente, cuando crea su próxima migración, no omite las intermedias, por lo que simplemente migrará a través de ellas más tarde. Parece que podría haber una mejor manera.
mlissner
44
@mlissner Si realmente quiere, después de revertir la base de datos, vaya a la carpeta de migraciones de la aplicación dada (en el ejemplo anterior your_app / migrations) y elimine la migración no deseada
Josh Russo
1
Exactamente: el sur nunca se saltea las migraciones; espera que los archivos de 0001-nnnn representen un conjunto consistente de migraciones, para cualquier valor de nnnn. Si ese no es el caso, debe volver a ordenar o eliminar los infractores usted mismo.
Ian Clelland
217

En caso de que alguien (como yo) se preguntara cómo migrar desde la inicial (0001) :

django-admin.py migrate some_app zero

salida:

Running migrations for some_app:
 - Migrating backwards to zero state.
 < some_app:0001_initial

"cero" es un estado especial antes de cualquier migración.

Referencia: http://south.aeracode.org/docs/commands.html

Ctrl-C
fuente
66
Alguien ejecutó la migración 0001 - falso, y esta era la única forma de ejecutar 0001 al revés. ¡Gracias!
jmanning2k
1
Respuesta muy importante, me preguntaba por qué migrate 0000no funcionó. Acerca de la migración falsa, sí, es posible que la necesite, por ejemplo, si solo necesita deshacer la migración inicial (probablemente incorrecta), pero el historial de migración piensa que esta migración nunca ocurrió.
Tomasz Gandor
3

Agregue un nombre de migración al final de los parámetros:

./manage.py migrate app-name 00xx-migration-name
Jerzyk
fuente
2
Está bien, y lo hice antes, pero es mucho escribir / pegar. El simple número de "estado", en este caso 00xx, es suficiente. Al mejorar y probar una migración, puede tener ambos comandos en el historial: adelante (sin argumento), hacia atrás con el número de estado anterior.
Tomasz Gandor