python git alembic

python - Revisión de alambique-error de múltiples cabezas(debido a la bifurcación)



git alembic (3)

Tengo una aplicación y quería crear una nueva migración para ella hoy. Cuando corro

$ alembic revision -m "__name__"

Recibí un mensaje

Only a single head is supported. The script directory has multiple heads (due branching), which must be resolved by manually editing the revision files to form a linear sequence. Run `alembic branches` to see the divergence(s).

Corriendo

alembic branches

no da nada

Soy nuevo en alambique. Hay 2 desarrolladores trabajando en esta aplicación y tenemos 2 sucursales de git: masterización y desarrollo (no estoy seguro si esto tiene algo que ver con esto).

¿Alguna pista sobre de qué se trata?


Este problema ocurre cuando dos migraciones de alambique se ramifican desde la misma migración. Por lo general, esto sucede cuando varias personas están haciendo cambios en el esquema. Para solucionarlo, solo tiene que ajustar el down_revision de su migración para que sea el último. La alembic history nos muestra esto:

2f4682466279 -> f34e92e9dc54 (head), Fifth revision (on a separate branch) 2f4682466279 -> f673ac37b34a (head), Fifth revision (local) 2dc9337c3987 -> 2f4682466279, Fourth revision 0fa2aed0866a -> 2dc9337c3987, Third revision 22af4a75cf06 -> 0fa2aed0866a, Second revision 9a8942e953eb -> 22af4a75cf06, First revision

Puede ver que una de las quintas revisiones se realizó localmente y su revisión descendente es 2f4682466279 pero quien haya realizado la otra quinta revisión también recibió la misma revisión descendente.

Vaya a uno de los archivos de la Quinta revisión y actualice la variable down_revision para hacer referencia a la otra quinta revisión, como esto:

f673ac37b34a -> f34e92e9dc54 (head), Fifth revision (on a separate branch) 2f4682466279 -> f673ac37b34a, Fifth revision (local) 2dc9337c3987 -> 2f4682466279, Fourth revision 0fa2aed0866a -> 2dc9337c3987, Third revision 22af4a75cf06 -> 0fa2aed0866a, Second revision 9a8942e953eb -> 22af4a75cf06, First revision

En este caso, actualicé la migración f34e92e9dc54 para tener down_revision=''f673ac37b34a'' .


He corrido

$ python manage.py db history

Y como resultado tengo

vagrant@precise64:/vagrant$ python manage.py db history Rev: 29c319804087 (head) Parent: 313837798149 Path: migrations/versions/29c319804087_.py empty message Revision ID: 29c319804087 Revises: 313837798149 Create Date: 2014-03-05 21:26:32.538027 Rev: 313837798149 Parent: 280061454d2a Path: migrations/versions/313837798149_.py empty message Revision ID: 313837798149 Revises: 280061454d2a Create Date: 2014-01-10 03:19:39.838932 Rev: 280061454d2a Parent: None Path: migrations/versions/280061454d2a_.py empty message Revision ID: 280061454d2a Revises: None Create Date: 2013-12-08 03:04:55.885033 Rev: 2e74f61d3b80 (head) Parent: 49501407aec9 Path: migrations/versions/2e74f61d3b80_o2_lease.py o2 lease Revision ID: 2e74f61d3b80 Revises: 49501407aec9 Create Date: 2014-02-28 10:38:06.187420 Rev: 49501407aec9 Parent: None Path: migrations/versions/49501407aec9_.py empty message Revision ID: 49501407aec9 Revises: None Create Date: 2014-01-22 11:27:08.002187

Lo que puedes ver aquí es de 2 ramas diferentes. Uno comienza desde 49501407aec9 y el segundo desde 280061454d2a. Moví 49501407aec9 y el siguiente 2e74f61d3b80 fuera del directorio / versiones, ejecute

$ python manage.py db revision

y creó un nuevo archivo de migración.


Quizás la solución más convencional (y robusta) es utilizar alembic merge heads . De la misma manera que cuando tiene dos sucursales en Git, puede volver a unirlas con un compromiso de fusión, en Alembic, cuando tiene dos sucursales, puede volver a unirlas con una revisión de fusión.

Por ejemplo, supongamos que tenemos una revisión 1a6b1a4a0574 que agrega la tabla A, y una revisión 2e49118db057 que agrega la tabla B. Podemos ver estas revisiones (ambas marcadas como (head) ) en la alembic history :

$ alembic history <base> -> 2e49118db057 (head), Add table B <base> -> 1a6b1a4a0574 (head), Add table A

Luego podemos fusionarlos ejecutando alembic merge heads :

$ alembic merge heads Generating /Users/markamery/alembictest/alembic/versions/409782f4c459_.py ... done $ alembic history 2e49118db057, 1a6b1a4a0574 -> 409782f4c459 (head) (mergepoint), empty message <base> -> 2e49118db057, Add table B <base> -> 1a6b1a4a0574, Add table A

Si una de sus revisiones ya se ha ejecutado en alguna parte (incluso en la máquina de desarrollo de uno de sus compañeros de trabajo), entonces probablemente desee utilizar la alembic merge lugar de jugar con la down_revision de una de las revisiones, como sugieren las otras respuestas aquí. . El peligro de retoques con la revisión descendente es que puede dar lugar a una revisión que nunca se aplica. Por ejemplo, supongamos que su colega Bob ya ha bajado su rama con la revisión 2e49118db057 y ha ejecutado un alembic upgrade head , creando la tabla B. Entonces, decide modificar el down_revision de 2e49118db057 para apuntar a 1a6b1a4a0574, que Bob nunca ha visto ni corrido antes. Bob baja el cambio, ejecuta el alembic upgrade head y ... no pasa nada, porque en lo que respecta a Alambique, ya está a la head y no necesita ejecutar 1a6b1a4a0574. Y así, Bob termina nunca obteniendo la tabla A y probablemente nunca se da cuenta de por qué su base de datos está en un estado roto.

No rompas la base de datos de Bob, haz una revisión de fusión en su lugar.