Skip to content

Instantly share code, notes, and snippets.

@marcorichetta
Last active August 14, 2020 01:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save marcorichetta/dd44fbda206fe0edca6466f5335e1ff2 to your computer and use it in GitHub Desktop.
Save marcorichetta/dd44fbda206fe0edca6466f5335e1ff2 to your computer and use it in GitHub Desktop.
Squashing Django migrations

Squashing migrations en Django

Referencia: https://docs.djangoproject.com/en/3.0/topics/migrations/#squashing-migrations

  1. Generar la nueva migración
python manage.py squashmigrations nombre_app num_migracion (También puede ser el nombre)

python manage.py squashmigrations users 0004
  1. git add + commit de la nueva migración creada
  2. Probar que la migración funciona correctamente (#CircularDependencyError)
  3. Por último, Django recomienda hacer la transición de la squashed migration a una migración normal. Para esto deberemos:
    1. Borrar las migraciones reemplazadas.

    2. Actualizar las migraciones que dependen de alguna de las migraciones reemplazadas.

      Por ejemplo, si en mi app gestion hice un squash de las migraciones 0001 a 0006 ahora tendré una nueva llamada 0001_squashed_0006.py.

      En mi caso, al tener la migración 0007 que dependía de la 0003, la cual fue squasheada, deberé actualizar la migración 0007

      0007.py

      class Migration(migrations.Migration):
      
      # Ahora depende de la nueva migración
      +dependencies = [("gestion", "0001_squashed_0006")]
      -dependencies = [("gestion", "0006")]
    3. Borrar la lista replaces de la nueva migración creada.

      0001_squashed_0006.py

      class Migration(migrations.Migration):
      
         replaces = [
             ("gestion", "0001"),
             ("gestion", "0002"),
             ("gestion", "0003"),
             ("gestion", "0004"),
             ("gestion", "0005"),
             ("gestion", "0006"),
         ]

NodeNotFoundError

Puede que Django nos notifique que no encuentra una de las migraciones reemplazadas.

    ```bash
    django.db.migrations.exceptions.NodeNotFoundError: 
    Migration gestion.0007 dependencies reference nonexistent 
    parent node ('gestion', '0006')
    ```

CircularDependencyError

raise CircularDependencyError(", ".join("%s.%s" % n for n in cycle))
django.db.migrations.exceptions.CircularDependencyError: 
gestion.0001_squashed_0010_auto_20191101_1616, 
clientes.0001_squashed_0004_auto_20191101_1227
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment