====== 07 - Migraciones: Flyway ====== El **esquema** evoluciona con el código: en cada cambio se crean tablas, se añaden columnas, se ajustan índices. Si cada entorno — el servidor local de cada desarrollador, el contenedor de pruebas, el despliegue — ejecuta sus DDL a mano, acaban desincronizados y «funciona aquí» deja de garantizarse. Las **migraciones versionadas** versionan el esquema junto al código; **Flyway** las aplica en orden. ===== 1. Una migración ===== Un fichero SQL por cambio, con su versión y una descripción en el nombre: src/main/resources/db/migration/ ├── V1__create_publisher_and_book.sql ├── V2__add_book_author_table.sql └── V3__add_stock_column.sql ^ Regla ^ Motivo ^ | La versión fija el orden | El esquema evoluciona paso a paso, igual en todos los entornos | | Solo SQL del motor (DDL, y DML si procede) | Se ejecuta tal cual contra MariaDB, sin traducción | | **Inmutabilidad**: una aplicada no se toca | Ya se aplicó en otros entornos; el siguiente cambio es una migración nueva | ===== 2. Cómo funciona ===== Al arrancar, **Flyway** busca los scripts en el classpath, los ordena por versión y los compara con la tabla ''flyway_schema_history'' (la crea la primera vez): aplica solo los pendientes y registra cada uno con su **checksum**, que detecta cualquier modificación sobre un script ya aplicado. ^ Columna ^ Guarda ^ | ''version'' | La versión aplicada (''1'', ''2''...) | | ''description'' | La del nombre del fichero | | ''checksum'' | La firma del contenido: cambiar el fichero falla | ===== 3. Aplicarlas en el proyecto ===== org.flywaydb flyway-core 11.7.2 Flyway.configure() .dataSource(url, username, password) .load() .migrate(); ''migrate()'' se ejecuta **al arrancar la aplicación**, antes de la primera conexión del pool (tema 06): así el esquema que existe corresponde siempre al código que corre. Como alternativa, el plugin de Maven permite ejecutar ''mvn flyway:migrate'' desde la línea de comandos. ===== 4. El mismo esquema en todos lados ===== * **Desarrollo:** cada cambio añade una migración ''V(n+1)''; al arrancar se aplica en local. * **Pruebas:** el contenedor de **Testcontainers** arranca vacío y aplica **las mismas migraciones** (se describe en el tema de pruebas de integración de Entornos): el esquema probado es exactamente el del proyecto. * **Despliegue:** las mismas migraciones contra el servidor real. Sigue valiendo la nota del tema DDL: la **misma versión de MariaDB** en todos los entornos. El SQL de las migraciones es el que se va a comportar en producción.