DEV Community

Isaias Velasquez
Isaias Velasquez

Posted on

How to versionar o banco de dados com Flyway sem medo

Flyway versiona o schema do banco de dados da mesma forma que o Git versiona o codigo fonte. Cada migracao e um arquivo SQL que o Flyway executa na ordem certa.

Adicione a dependencia no build.gradle.kts:

implementation("org.flywaydb:flyway-core")
runtimeOnly("org.flywaydb:flyway-database-postgresql")
Enter fullscreen mode Exit fullscreen mode

Com Spring Boot, a configuracao e simples:

# application.properties
spring.flyway.enabled=true
spring.flyway.locations=classpath:db/migration
Enter fullscreen mode Exit fullscreen mode

Crie o primeiro arquivo de migracao em src/main/resources/db/migration/V1__criar_tabela_usuarios.sql:

CREATE TABLE usuarios (
    id BIGSERIAL PRIMARY KEY,
    nome VARCHAR(100) NOT NULL,
    email VARCHAR(150) UNIQUE NOT NULL,
    criado_em TIMESTAMP DEFAULT NOW()
);
Enter fullscreen mode Exit fullscreen mode

A segunda migracao V2__adicionar_coluna_telefone.sql:

ALTER TABLE usuarios ADD COLUMN telefone VARCHAR(20);
Enter fullscreen mode Exit fullscreen mode

O padrao de nome e V{numero}__{descricao}.sql. O Flyway executa em ordem numerica e nunca repete o mesmo arquivo.

Para rodar as migracoes manualmente:

./gradlew flywayMigrate
Enter fullscreen mode Exit fullscreen mode

Para ver o status:

./gradlew flywayInfo
Enter fullscreen mode Exit fullscreen mode

Isso mostra quais migracoes ja foram aplicadas e quais estao pendentes.

Flyway cria uma tabela chamada flyway_schema_history no banco. Ela registra cada migracao executada:

SELECT version, description, installed_on, success
FROM flyway_schema_history;
Enter fullscreen mode Exit fullscreen mode

Se uma migracao falha, o Flyway marca como falha e nao continua. Voce precisa corrigir o erro e rodar flywayRepair antes de tentar de novo.

Para migracoes irreversiveis, adicione o script de rollback separadamente:

# V3__adicionar_tabela_pedidos.sql
CREATE TABLE pedidos (
    id BIGSERIAL PRIMARY KEY,
    usuario_id BIGINT REFERENCES usuarios(id),
    total DECIMAL(10,2) NOT NULL,
    criado_em TIMESTAMP DEFAULT NOW()
);

# V3.1__rollback_V3.sql
DROP TABLE IF EXISTS pedidos;
Enter fullscreen mode Exit fullscreen mode

O Flyway nao executa rollbacks automaticamente. Mas ter o script pronto ajuda em emergencias.

Para ambientes com dados reais, nunca altere migracoes ja executadas. Crie uma nova migracao:

-- ERRADO: alterar V2__adicionar_coluna_telefone.sql depois de rodar
-- CERTO: criar V4__alterar_coluna_telefone.sql

ALTER TABLE usuarios ALTER COLUMN telefone TYPE VARCHAR(30);
Enter fullscreen mode Exit fullscreen mode

Voce pode usar Flyway com SQL puro ou com Java para logicas complexas. Mas SQL puro e mais simples e funciona em qualquer banco.

That's all for now.
Thanks for reading!

Top comments (0)