Migrações de banco de dados em Java: por que são necessárias e como funcionam
O desenvolvimento de qualquer aplicação séria em Java está intrinsecamente ligado à evolução do esquema do banco de dados. Adicionar novos campos, alterar tipos de dados, criar índices — tudo isso é inevitável durante o desenvolvimento do projeto. A execução manual de scripts SQL em diferentes ambientes (ambiente de desenvolvimento local, servidor de teste, produção) rapidamente leva ao caos: os scripts se perdem, são executados fora de ordem e o banco de dados de uma equipe difere do de outra. A solução para este problema são as migrações de banco de dados (database migrations).
As migrações permitem versionar as alterações no esquema, aplicá-las automaticamente na sequência correta e reverter quando necessário. No mundo Java, existem dois líderes indiscutíveis nesta área: Flyway e Liquibase. Vamos analisá-los em detalhes.
Flyway: simplicidade e confiabilidade
Flyway é uma ferramenta de migração leve, simples e poderosa. Sua filosofia é: "Migrações são apenas SQL ou classes Java". Os princípios básicos de funcionamento são:
- Versionamento: cada arquivo de migração possui um número de versão único (por exemplo,
V1__create_users.sql,V2__add_email.sql). - Ordem de execução: o Flyway rastreia as migrações aplicadas em uma tabela especial (
flyway_schema_history) e aplica apenas as novas. - Dois tipos de migrações: scripts SQL e migrações Java (para lógica complexa).
- Reversão: suporta migrações "undo" (na versão paga) ou a escrita manual de scripts de reversão.
Exemplo de uso do Flyway
Suponha que você precise criar uma tabela de usuários. Você cria o arquivo db/migration/V1__create_users.sql:
CREATE TABLE users ( id BIGINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);Em seguida, adiciona a segunda migração V2__add_age.sql:
ALTER TABLE users ADD COLUMN age INT;A conexão do Flyway a uma aplicação Spring Boot é feita através do application.properties:
spring.flyway.enabled=truespring.flyway.locations=classpath:db/migrationspring.datasource.url=jdbc:postgresql://localhost:5432/mydbspring.datasource.username=userspring.datasource.password=passAo iniciar a aplicação, o Flyway verificará a tabela de histórico e aplicará todas as novas migrações. Se uma migração já tiver sido executada, ela será ignorada.
Liquibase: flexibilidade e controle
Liquibase é uma ferramenta mais flexível e poderosa que suporta vários formatos de descrição de alterações: XML, YAML, JSON e SQL. Sua característica principal são os changesets (conjuntos de alterações).
- Identificador único: cada changeset possui um
ide umauthor. - Geração automática de SQL: o Liquibase pode gerar SQL para um SGBD específico (PostgreSQL, MySQL, Oracle, etc.).
- Contextos: é possível separar migrações para diferentes ambientes (dev, test, prod).
- Reversão: cada changeset pode ter uma instrução de reversão (
rollback).
Exemplo de uso do Liquibase
Exemplo de changeset no formato XML (db/changelog/db.changelog-master.xml):
<?xml version="1.0" encoding="UTF-8"?><databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.9.xsd">
<changeSet id="1" author="pythonlib"> < Também na biblioteca
Agendador de Tarefas Java: Quartz Scheduler – Guia Completo
Trabalhando com YAML em Swift (iOS/macOS) — Bibliotecas Yams e YamlSwift
WebSocket em C++: bibliotecas e aplicação prática
Filas de Tarefas em Java: ExecutorService e ThreadPoolExecutor
Processamento de Imagens em Java: Bibliotecas, Ferramentas e Exemplos de Código