Use Liquibase para evoluir com segurança seu esquema de banco de dados
1. Visão geral
Neste tutorial rápido, usaremosLiquibase to evolve the database schema de um aplicativo da web Java.
Vamos nos concentrar em um aplicativo Java geral primeiro, e também vamos dar uma olhada em algumas opções interessantes disponíveis para Spring e Hibernate.
Resumidamente, o núcleo do uso do Liquibase éthe changeLog file - um arquivo XML que rastreia todas as mudanças que precisam ser executadas para atualizar o banco de dados.
Vamos começar com a dependência Maven que precisamos adicionar ao nossopom.xml:
org.liquibase
liquibase-core
3.4.1
Você também pode verificar se há uma versão mais recente do liquibase-corehere.
Leitura adicional:
Introdução ao Liquibase Rollback
Aprenda a usar o recurso de reversão de uma estrutura Liquibase.
Migrações de banco de dados com Flyway
Este artigo descreve os principais conceitos do Flyway e como podemos usar essa estrutura para remodelar continuamente o esquema de banco de dados de nosso aplicativo de forma confiável e fácil.
Guia rápido sobre o carregamento de dados iniciais com o Spring Boot
Um exemplo rápido e prático de uso dos arquivos data.sql e schema.sql no Spring Boot.
2. O log de mudanças do banco de dados
Agora, vamos dar uma olhada em um arquivochangeLog simples - este apenas adiciona uma coluna “address” à tabela “users“:
Observe como o conjunto de mudanças é identificado por umide umauthor - para garantir que ele possa ser identificado de forma exclusiva e aplicado apenas uma vez.
Não vamos ver como conectar isso ao nosso aplicativo e garantir que ele seja executado quando o aplicativo for inicializado.
3. Execute Liquibase com um Spring Bean
Nossa primeira opção para executar as alterações na inicialização do aplicativo é através de um bean Spring. É claro que existem muitas outras maneiras, mas se estivermos lidando com um aplicativo Spring - esta é uma maneira boa e simples de fazer:
@Bean
public SpringLiquibase liquibase() {
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setChangeLog("classpath:liquibase-changeLog.xml");
liquibase.setDataSource(dataSource());
return liquibase;
}
Observe como estamos apontando para um arquivochangeLog válido que precisa existir no classpath.
4. Use Liquibase com Spring Boot
Se você estiver usandoSpring Boot, não há necessidade de definir umBean para Liquibase.
Tudo o que você precisa é colocar seu log de alterações em “db/changelog/db.changelog-master.yaml” e as migrações Liquibase serão executadas automaticamente na inicialização.
Observe que:
-
Você precisa adicionar a dependência “liquibase-core”.
-
Você pode alterar o arquivo de log de mudança padrão usando a propriedade “liquibase.change-log” - por exemplo:
liquibase.change-log=classpath:liquibase-changeLog.xml
5. Desativar Liquibase na inicialização por mola
Às vezes, podemos precisar desativar a execução da migração Liquibase na inicialização.
The simplest option we have is to use a spring.liquibase.enabled property. Dessa forma, toda a configuração restante do Liquibase permanece intocada.
Aqui está o exemplo para Spring Boot 2:
spring.liquibase.enabled=false
Para Spring Boot 1.x, precisamos usar uma propriedadeliquibase.enabled:
liquibase.enabled=false
6. Gere ochangeLog com um plugin Maven
Em vez de escrever o arquivochangeLog manualmente - podemos usar o plugin Liquibase Maven para gerar um e economizar muito trabalho.
6.1. Configuração de plugins
Aqui estão as alterações em nossopom.xml:
org.liquibase
liquibase-maven-plugin
3.4.1
...
org.liquibase
liquibase-maven-plugin
3.4.1
src/main/resources/liquibase.properties
6.2. Gere umChangeLog de um banco de dados existente
Podemos usar o plugin para gerar um registro de alterações a partir de um banco de dados existente:
mvn liquibase:generateChangeLog
Aqui estão osliquibase properties:
url=jdbc:mysql://localhost:3306/oauth_reddit
username=tutorialuser
password=tutorialmy5ql
driver=com.mysql.jdbc.Driver
outputChangeLogFile=src/main/resources/liquibase-outputChangeLog.xml
O resultado final é um arquivochangeLog que podemos usar para criar um esquema de banco de dados inicial ou para preencher dados. Veja como isso ficaria em nosso aplicativo de exemplo:
...
6.3. Gere umChangeLog a partir da diferença entre dois bancos de dados
Podemos usar o plugin para gerar um arquivochangeLog a partir das diferenças entre dois bancos de dados existentes (por exemplo: desenvolvimento e produção):
mvn liquibase:diff
Aqui estão as propriedades:
changeLogFile=src/main/resources/liquibase-changeLog.xml
url=jdbc:mysql://localhost:3306/oauth_reddit
username=tutorialuser
password=tutorialmy5ql
driver=com.mysql.jdbc.Driver
referenceUrl=jdbc:h2:mem:oauth_reddit
diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml
referenceDriver=org.h2.Driver
referenceUsername=sa
referencePassword=
E aqui está um snippet dochangeLog gerado:
Essa é uma maneira super poderosa de evoluir seu banco de dados, por exemplo, permitindo que o Hibernate gere automaticamente um novo esquema para desenvolvimento e, em seguida, use-o como um ponto de referência no esquema antigo.
7. Use o plug-in Liquibase Hibernate
Se o aplicativo usa Hibernate - vamos dar uma olhada em uma maneira muito útil de gerarchangeLog.
Primeiro - veja comothe liquibase-hibernate plugin deve ser configurado no Maven:
7.1. Configuração de plugins
Primeiro, vamos configurar o novo plug-in e usar as dependências certas:
org.liquibase
liquibase-maven-plugin
3.4.1
src/main/resources/liquibase.properties
org.liquibase.ext
liquibase-hibernate4
3.5
org.springframework
spring-beans
4.1.7.RELEASE
org.springframework.data
spring-data-jpa
1.7.3.RELEASE
7.2. Gere umchangeLog de diferenças entre um banco de dados e entidades de persistência
Agora a parte divertida. Podemos usar este plugin para gerar um arquivochangeLog a partir das diferenças entre um banco de dados existente (por exemplo, produção) e nossas novas entidades de persistência.
Então - para tornar as coisas simples - uma vez que uma entidade é modificada, você pode simplesmente gerar as mudanças no antigo esquema do banco de dados, obtendoa clean, powerful way to evolve your schema in production.
Aqui estão as propriedades liquibase:
changeLogFile=classpath:liquibase-changeLog.xml
url=jdbc:mysql://localhost:3306/oauth_reddit
username=tutorialuser
password=tutorialmy5ql
driver=com.mysql.jdbc.Driver
referenceUrl=hibernate:spring:org.example.persistence.model
?dialect=org.hibernate.dialect.MySQLDialect
diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml
Nota: OreferenceUrl está usando a verificação de pacote, portanto, o parâmetrodialect é necessário.
8. Conclusão
Neste tutorial, ilustramos várias maneiras de usar Liquibase e chegar a uma forma segura e madura deevolving and refactoring the DB schema of a Java app.
A implementação de todos esses exemplos e fragmentos de códigocan be found inmy github project - este é um projeto baseado em Eclipse, portanto, deve ser fácil de importar e executar como está.