Usando flyway con administración distribuida de código fuente (es decir, Git, Mercurial, etc.)

Soy parte de un gran proyecto de Java con múltiples modules (más o less 30 jarras) y estoy interesado en el uso de la ruta migratoria para gestionar migraciones de bases de datos.

Como parte de la política de la empresa, las secuencias de commands de migration relacionadas con cada proyecto se almacenan en cada module y en el momento de la migration se agregan para formar una secuencia de commands sql grande desde release -> release. (por ejemplo, build 234 -> 298). también es digno de mención que actualmente usamos CVS (obligatorio -_-cara) y estamos viendo a git como reemploop :).

debido a la naturaleza distribuida de Git, es contra-intuitivo pensar en numbers de versión secuencial para nombrar scripts de migration de routes migratorias. déjame seguir divagando …

Guión

  • Un usuario se bifurca del maestro A en su twig de características B
  • Secciones de usuario separadas de A para su propia característica C
  • Alguien comete un script para B Permite llamarlo script 1
  • Alguien más comete un script para C script 2
  • En algún momento, estos cambios se llevan a la twig principal

Y ahora, si todavía no puede ver el problema, el order en que se introducen estos cambios en el maestro es arbitrario. los desarrolladores no pueden versionar sus scripts de forma apropiada (suponiendo que no se realice ninguna comunicación con respecto al pedido de confirmación entre el equipo). script 2 se puede incorporar en algún momento, migrar, y luego la script 1 posterior se coloca y se coloca antes del file de script 2 en términos de versiones de secuencia de commands de ruta de vuelo.

Pregunta

¿Cómo gestiona Flyway las secuencias de commands " insertadas " cuando la database ya las ha migrado?

Esta es una de mis únicas preocupaciones al mover el sistema actual hacia el uso de la ruta migratoria y cualquier apreciación / ayuda sería apreciada.

Según este blog , Flyway ignora las migraciones fuera de order (es decir, solo migra los files más allá de la versión más reciente que ha migrado). sin embargo, la propiedad flyway.outOfOrder puede establecerse en true para permitir una flyway.outOfOrder a este problema de pedidos.

 flyway.outOfOrder=true 

Otro consejo útil es que en lugar de usar numbers integers incrementales para las versiones, use Timestamps. Cuanto más preciso sea el Timestamp, less posibilidades hay de una colisión de versión.

p.ej

 20140707.154401__create_customer_table.sql 20140707.154402__alter_customer_table.sql