Revertir migraciones en Django, 2 FORMAS

Video thumbnail

En Django no contamos con un comando directo como migrate rollback para revertir migraciones, lo cual sería extremadamente útil en muchas situaciones.

Muchas veces creamos nuestros modelos, generamos las migraciones asociadas mediante el comando makemigrations pero luego nos damos cuenta de que nos equivocamos en algo... y bueno, tremendo problema.

Opción 1: Revertir todas las migraciones de una app

Para este caso, te voy a mostrar un par de maneras de hacerlo. Nuevamente, pueden existir muchas implementaciones, pero todas van más o menos en la misma línea.

Una opción muy común es ejecutar el siguiente comando:

python manage.py migrate nombre_app zero

Por ejemplo, si tu app se llama blog, sería:

python manage.py migrate blog zero

¿Qué significa esto?

Que se van a revertir todas las migraciones de esa aplicación llamada blog, que se supone es la que tiene el problema y que necesitas corregir.

Luego de eso, debes hacer correcciones tanto en tu modelo como, posiblemente, en los archivos de migración generados.
Por ejemplo, si te faltó agregar el campo description, puedes hacerlo directamente en el modelo y también, si lo prefieres, modificar manualmente la migración duplicando y ajustando un bloque existente.

Opción 2: Revertir hasta una migración específica

Otra opción es indicar exactamente hasta qué migración deseas volver.
Por ejemplo:

python manage.py migrate blog 0002

Esto supone que quieres regresar a la migración 0002.

Recuerda que las migraciones van creciendo cada vez que haces cambios en tus modelos. Por ejemplo:

  • 0001_initial.py
  • 0002_add_description.py
  • 0003_add_subscribers.py

Y así sucesivamente, dependiendo de las modificaciones que vayas haciendo en la app blog.

Este método es útil si, por ejemplo, más adelante agregas una migración para suscriptores u otra tabla, y necesitas revertir solo hasta un punto específico sin borrar todo lo anterior.

¿Cuál usar?

En resumen:

  • Si quieres eliminar todas las migraciones de una app (por ejemplo, porque estás empezando de cero o el error está desde el inicio), puedes usar la opción del zero.
  • Si quieres revertir solo una migración específica sin eliminar todo, puedes usar el número exacto de migración como en el segundo método.

Este segundo comando sería lo más cercano al concepto de rollback, ya que te permite volver a un estado anterior puntual.
No es tan automático como rollback, pero en esencia cumple el mismo objetivo: revertir una migración para que puedas corregir algo que salió mal.

Así que, si solo tienes una migración o el error está en la primera, la opción del zero es perfecta.
Pero si necesitas un poco más de control, puedes especificar la migración exacta a la que deseas volver.

Acepto recibir anuncios de interes sobre este Blog.

Te muestro un par de formas para revertir migraciones en Django al no existir un comando de rollback en el framework.

- Andrés Cruz

In english