Managing Database Migrations
| Property |
Description |
spring.flyway.enabled |
Default true if on classpath |
spring.flyway.locations |
classpath:db/migration |
spring.flyway.baseline-on-migrate |
For existing DBs |
spring.flyway.schemas |
Target schemas |
spring.flyway.placeholders.* |
SQL placeholders |
2. Creating Flyway Migration Scripts
| Naming |
Type |
V1__create_users.sql |
Versioned (run once) |
V1.1__add_email_index.sql |
Sub-version |
R__refresh_views.sql |
Repeatable (re-run on change) |
U1__rollback.sql |
Undo (Teams edition) |
Example: Flyway migration: create users table
-- V1__create_users.sql
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
3. Using Flyway Callbacks and Placeholders
| Callback |
Fires |
beforeMigrate |
Before any migration |
afterMigrate |
After all complete |
afterEachMigrate |
After each script |
afterMigrateError |
On failure |
Example: Flyway schema placeholder
-- placeholders: ${app.schema}
CREATE SCHEMA IF NOT EXISTS ${app.schema};
| Property |
Default |
spring.liquibase.change-log |
classpath:/db/changelog/db.changelog-master.yaml |
spring.liquibase.contexts |
CSV of contexts |
spring.liquibase.labels |
Label expression |
spring.liquibase.default-schema |
Schema target |
5. Creating Liquibase Changesets
Example: Liquibase changeset for users table
databaseChangeLog:
- changeSet:
id: 001-create-users
author: alice
changes:
- createTable:
tableName: users
columns:
- column: { name: id, type: BIGINT, autoIncrement: true,
constraints: { primaryKey: true } }
- column: { name: email, type: VARCHAR(255),
constraints: { nullable: false, unique: true } }
6. Using Liquibase Contexts and Labels
| Element |
Purpose |
context: dev,test |
Run only in given contexts |
labels: feature-x,seed |
Tag-based filtering |
--contexts="dev" |
CLI selection |
7. Rolling Back Migrations (Liquibase)
| Command |
Action |
liquibase rollbackCount 1 |
Undo last N |
liquibase rollback <tag> |
Roll back to tag |
liquibase rollbackToDate |
By timestamp |
8. Validating Migration Scripts
| Tool |
Command |
| Flyway |
mvn flyway:validate — checksums must match |
| Liquibase |
liquibase validate |
| Boot |
Fails fast at startup if checksum mismatch |
9. Using Baseline on Existing Databases
Example: Flyway baseline for existing schema
spring:
flyway:
baseline-on-migrate: true
baseline-version: 1
baseline-description: "Existing schema baseline"
10. Generating DDL from JPA Entities
| Value |
Effect |
none |
Production default |
validate |
Verify schema matches |
update |
Apply non-destructive changes (dev only) |
create |
Drop + create on startup |
create-drop |
Above + drop on shutdown |
Warning: Use validate in production; manage schema with
Flyway/Liquibase.
11. Using Flyway vs Liquibase Comparison
Flyway
- SQL-first, simple V/R naming
- Easier learning curve
- Less DB abstraction
- Rollback in paid edition
Liquibase
- YAML/XML/JSON changesets
- DB-agnostic abstractions
- Built-in rollback
- More verbose