migrations migraciones migracion manage make forzar force django django-migrations

migraciones - Ejecutar una migración de datos Django



no migrations to apply django (2)

La respuesta de Alasdair da un descargo de responsabilidad sobre esto, pero falsear una migración a la anterior solo es seguro si su migración es idempotente, lo que significa que puede ejecutarla varias veces sin efectos secundarios como datos duplicados. La mayoría de las personas no escriben sus migraciones de esta manera, pero es una buena práctica.

Tienes dos opciones para hacer seguro este proceso:

  1. Haga que sus migraciones de datos sean idempotentes. Esto significa que cualquier dato creado se reutiliza (como con el método Model.objects.get_or_create() ) o se elimina y se Model.objects.get_or_create() crear. Reutilizada es la mejor opción, ya que eliminar y recrear cambiará los índices y las secuencias de la base de datos.
  2. Realiza migraciones de datos inversas. Puede hacerlo pasando 2 funciones a las migrations.RunPython() . Por ejemplo, si tiene migrations.RunPython(add_countries) , cambiaría eso a migrations.RunPython(add_countries, remove_countries) y eliminaría cualquier país relevante en la segunda función.

Si elige la opción # 2 entonces ejecutaría:

./manage.py migrate yourapp 0010_my_previous_data_migration ./manage.py migrate yourapp 0011_my_data_migration

Si quisieras hacer eso de una sola línea para que puedas usarlo una y otra vez:

./manage.py migrate yourapp 0010_my_previous_data_migration && ./manage.py migrate yourapp 0011_my_data_migration

¿Cómo puedo volver a ejecutar una migración de datos en Django 1.8+? Si es relevante, mi migración tiene el número 0011_my_data_migration.py y es la migración más reciente.


Volver a la migración antes de la que desea volver a ejecutar.

./manage.py migrate --fake yourapp 0010_my_previous_data_migration

A continuación, vuelva a ejecutar la migración.

./manage.py migrate yourapp 0011_my_data_migration

Luego puede volver a la migración más reciente que ha ejecutado. En su caso, dijo que 0011 era el último, por lo que puede omitir esta etapa.

./manage.py migrate --fake yourapp 0014_my_latest_data_migration

Tenga en cuenta que, según el estado de su base de datos y el contenido de las migraciones, volver a ejecutar una migración como esta podría causar errores. Tenga en cuenta la advertencia en la documentación sobre la opción --fake :

Esto está dirigido a usuarios avanzados para manipular el estado de migración actual directamente si están aplicando cambios manualmente; se le advierte que al usar --fake corre el riesgo de poner la tabla de estado de migración en un estado donde se necesitará la recuperación manual para que las migraciones se ejecuten correctamente.