Flyway y Liquibase
Flyway y Liquibase son los dos ejecutores de migraciones basados en JVM más comunes para PostgreSQL en pipelines empresariales. Ambos rastrean los cambios aplicados, soportan CI y se integran con Spring y la orquestación de lanzamientos.
Receta
# Flyway
flyway -url=jdbc:postgresql://localhost:5432/myapp \
-user=app_migrator -password="$DB_PASS" \
-locations=filesystem:db/migration \
migrate
# Liquibase
liquibase --url=jdbc:postgresql://localhost:5432/myapp \
--username=app_migrator --password="$DB_PASS" \
--changeLogFile=db/changelog/db.changelog-master.yaml \
updateCuándo usar esto: Múltiples destinos de despliegue, requisitos de auditoría, validación de checksums y equipos ya estandarizados en herramientas JVM.
Ejemplo de Trabajo
Diseño de Flyway:
db/migration/
V1__baseline.sql
V2__add_orders.sql
V3__orders_index_concurrent.sql # nota: ejecutar fuera de txn - ver documentación
-- V2__add_orders.sql
SET ROLE app_owner;
CREATE TABLE app.orders (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
total_cents integer NOT NULL
);
RESET ROLE;Changelog maestro de Liquibase:
# db/changelog/db.changelog-master.yaml
databaseChangeLog:
- include:
file: changes/001-baseline.sql
relativeToChangelogFile: true
- include:
file: changes/002-orders.yaml
relativeToChangelogFile: true# changes/002-orders.yaml
databaseChangeLog:
- changeSet:
id: 002-orders
author: data-team
changes:
- sqlFile:
path: 002-orders.sql
relativeToChangelogFile: true
rollback:
- sql: DROP TABLE IF EXISTS app.orders;Lo que esto demuestra:
- Flyway: un archivo SQL por versión, nomenclatura lineal
V{n}__ - Liquibase: changelog YAML/XML con bloques de rollback opcionales por
changeSet - Ambos registran el historial en tablas de metadatos automáticamente
Profundización
Comparación
| Característica | Flyway | Liquibase |
|---|---|---|
| Formato principal | Archivos SQL | YAML/XML/SQL/JSON |
| Rollback | Scripts de deshacer (Equipos) / corrección directa | Secciones de rollback integradas |
| Checksums | Sí | Sí |
| Historia de índice concurrente | Migraciones manuales divididas | Igual - archivo SQL con runInTransaction: false |
| Curva de aprendizaje | Menor para equipos SQL-first | Mayor, más flexible |
Configuraciones Específicas de PostgreSQL
# flyway.conf
flyway.postgresql.transactional.lock=false
flyway.cleanDisabled=true# Liquibase changeSet para índice CONCURRENTE
- changeSet:
id: idx-concurrent
runInTransaction: false
changes:
- sql:
sql: CREATE INDEX CONCURRENTLY idx_orders_created ON app.orders (created_at);CREATE INDEX CONCURRENTLYno puede ejecutarse en una transacción.- Deshabilitar
cleanen Flyway de producción: elimina todos los objetos. - Usar
lock_timeoutystatement_timeouten las migraciones SQL (ver reglas de seguridad).
Integración CI
flyway validate # detección de deriva de checksums
flyway info # pendientes vs aplicadas
liquibase status
liquibase validateTrampas
- Editar archivo de migración aplicado - El desajuste de checksum bloquea el despliegue. Solución: Nueva migración directa
V4__fix.sql, nunca reescribirV2. - Índice concurrente dentro de una transacción - El valor predeterminado de Flyway lo envuelve en una transacción; la migración falla. Solución:
executeInTransaction=falsepor migración (Flyway) orunInTransaction: false(Liquibase). - Baja confianza en el rollback de Liquibase - El SQL de rollback no probado se corrompe. Solución: Tratar el rollback solo para simulacros; preferir correcciones directas de expansión/contracción.
- Migrador superusuario - Concesiones y valores predeterminados de RLS incorrectos. Solución:
app_migratorconSET ROLE app_owner. - Historial diferente por entorno - Hotfix seleccionado solo en producción. Solución: Mismo SHA de git a través del pipeline de desarrollo/staging/producción.
Alternativas
| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| Sqitch | Tienda Perl, despliegue/reversión explícitos | El equipo quiere dependencias CLI cero |
| Rails/Prisma/Alembic | El framework de la aplicación posee el esquema | El DBA exige un repositorio git de SQL crudo |
| psql ejecutado manualmente | Nunca en producción | Necesitas un rastro de auditoría |
Preguntas Frecuentes
¿Flyway vs Liquibase para expertos en Postgres?
Flyway cuando el equipo es SQL-first. Liquibase cuando necesitas metadatos de changelog más ricos y un DSL de rollback en juntas de cambios empresariales.
¿Dónde poner los datos de semilla?
Migraciones repetibles separadas (R__seed.sql en Flyway) o pipelines no de producción solamente - no mezclar DDL de producción versionado casualmente.
¿Baseline de producción existente?
Flyway baseline o Liquibase changelog-sync - operación única con ADR y copia de seguridad escritas.
Relacionado
- Conceptos Básicos de Migraciones - principios de SQL versionado
- DDL sin tiempo de inactividad - operaciones concurrentes
- Estrategia de Rollback - política de solo avance
Versiones de Stack: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x, y PostGIS 3.5+.