Migrações de banco de dados com Flyway
1. Introdução
Este artigo descreve os conceitos-chave deFlyway e como podemos usar essa estrutura para remodelar continuamente o esquema de banco de dados de nosso aplicativo de forma fácil e confiável No final, apresentaremos um exemplo de gerenciamento de um banco de dados H2 em memória usando um plugin Maven Flyway.
O Flyway atualiza um banco de dados de uma versão para outra usando migrações. Podemos escrever migrações no SQL com sintaxe específica do banco de dados ou em Java para transformações avançadas do banco de dados.
As migrações podem ser versionadas ou repetíveis. O primeiro tem uma versão única e é aplicada exatamente uma vez. Este último não possui uma versão. Em vez disso, eles são (re) aplicados toda vez que a soma de verificação é alterada.
Em uma única execução de migração, migrações repetíveis sempre são aplicadas por último, após a execução de migrações com versão pendentes. Migrações repetidas são aplicadas na ordem de sua descrição. Para uma única migração, todas as instruções são executadas em uma única transação do banco de dados.
Neste artigo, focamos principalmente em como podemos usar o plug-in Maven para realizar migrações de banco de dados.
2. Plugin Flyway Maven
Para instalar um plugin Flyway Maven, adicione a seguinte definição de plugin ao seupom.xml:
org.flywaydb
flyway-maven-plugin
4.0.3
Você pode verificar a versão mais recente do plugin disponível emMaven repository.
Este plugin Maven pode ser configurado de quatro maneiras diferentes. Consulte odocumentation para obter uma lista de todas as propriedades configuráveis.
2.1. Configuração de plugins
Podemos configurar o plugin diretamente pelo uso da tag<configuration> na definição do plugin dopom.xml:
org.flywaydb
flyway-maven-plugin
4.0.3
databaseUser
databasePassword
schemaName
...
2.2. Propriedades do Maven
Também podemos configurar o plugin especificando propriedades configuráveis como Mavenproperties empom.xml:
...
databaseUser
databasePassword
schemaName
...
...
2.3. Arquivo de configuração externa
Também podemos fornecer a configuração do plugin em um arquivo.properties separado:
flyway.user=databaseUser
flyway.password=databasePassword
flyway.schemas=schemaName
...
O nome do arquivo de configuração padrão éflyway.properties e deve residir no mesmo diretório que o arquivopom.xml. A codificação é especificada porflyway.encoding (o padrão éUTF-8).
Se você estiver usando qualquer outro nome (por exemplo,customConfig.properties) como o arquivo de configuração, ele deve ser especificado explicitamente ao invocar o comando Maven:
$ mvn -Dflyway.configFile=customConfig.properties
2.4. Propriedades do sistema
Por fim, todas as propriedades de configuração também podem ser especificadas como propriedades do sistema ao chamar o Maven na linha de comando:
$ mvn -Dflyway.user=databaseUser -Dflyway.password=databasePassword
-Dflyway.schemas=schemaName
A seguir, é apresentada uma ordem de precedência quando uma configuração é especificada em mais de uma maneira:
-
Propriedades do sistema
-
Arquivo de configuração externa
-
Propriedades de Maven
-
Configuração de plugins
3. Exemplo de migração
Nesta seção, percorremos as etapas necessárias para migrar um esquema de banco de dados para um banco de dados H2 na memória usando o plug-in Maven. Usamos um arquivo externo para configurar o Flyway.
3.1. Atualizar POM
Adicione uma dependência de driver de banco de dados apropriada para o banco de dados H2 empom.xml:
com.h2database
h2
1.4.196
Você pode verificar a versão mais recente do driver disponível emMaven repository. Adicione o plugin Flyway apom.xml conforme explicado na Seção 2 acima.
3.2. Configurar Flyway usando arquivo externo
Crie um arquivomyFlywayConfig.properties em$PROJECT_ROOT com o seguinte conteúdo:
flyway.user=databaseUser
flyway.password=databasePassword
flyway.schemas=app-db
flyway.url=jdbc:h2:mem:DATABASE
flyway.locations=filesystem:db/migration
A configuração acima especifica que nossos scripts de migração estão localizados no diretóriodb/migration. Ele se conecta a uma instância H2 na memória usandodatabaseUseredatabasePassword.
O esquema do banco de dados do aplicativo éapp-db. Substituaflyway.user, flyway.password, flyway.url pelo nome de usuário do banco de dados, senha do banco de dados e host / porta do banco de dados apropriadamente.
3.3. Definir a primeira migração
O Flyway adere à seguinte convenção de nomenclatura para scripts de migração:
<Prefix><Version>_
Onde:
-
<Prefix> - o prefixo padrão éV, que pode ser configurado no arquivo de configuração acima usando a propriedadeflyway.sqlMigrationPrefix.
-
<Version> - Número da versão de migração. As versões principais e secundárias podem ser separadas por umunderscore. A versão da migração deve sempre começar com 1.
-
<Description> - Descrição textual da migração. A descrição precisa ser separada dos números de versão com um sublinhado duplo.
Exemplo:V1_1_0__my_first_migration.sql
Crie um diretóriodb/migration em$PROJECT_ROOT com um script de migração chamadoV1_0__create_employee_schema.sql contendo instruções SQL para criar, por exemplo uma tabela de funcionários:
CREATE TABLE IF NOT EXISTS `employee` (
`id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` varchar(20),
`email` varchar(50),
`date_of_birth` timestamp
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;
3.4. Executar migrações
Invoque o seguinte comando Maven de$PROJECT_ROOT para executar migrações de banco de dados:
$ mvn clean flyway:migrate -Dflyway.configFile=myFlywayConfig.properties
Isso deve resultar em uma primeira migração bem-sucedida. O esquema do banco de dados agora pode ser representado da seguinte maneira:
employee:
+----+------+-------+---------------+
| id | name | email | date_of_birth |
+----+------+-------+---------------+
Repita as etapas das subseções 3.3. e 3.4. para definir e executar novas migrações à vontade.
3.5. Definir e executar a segunda migração
Crie um segundo arquivo de migração com o nomeV2_0_create_department_schema.sql contendo as duas consultas a seguir:
CREATE TABLE IF NOT EXISTS `department` (
`id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` varchar(20)
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;
ALTER TABLE `employee` ADD `dept_id` int AFTER `email`;
Execute uma migração semelhante à mencionada na seção 3.4 acima. O esquema do banco de dados parece seguir após executar com êxito a segunda migração.
employee:
+----+------+-------+---------+---------------+
| id | name | email | dept_id | date_of_birth |
+----+------+-------+---------+---------------+
department:
+----+------+
| id | name |
+----+------+
Agora podemos verificar se as duas migrações foram realmente bem-sucedidas invocando o seguinte comando Maven:
$ mvn flyway:info -Dflyway.configFile=myFlywayConfig.properties
4. Como funciona o Flyway
Para acompanhar quais migrações já foram aplicadas, quando e por quem, ela adiciona uma tabela de contabilidade especial ao seu esquema. Essa tabela de metadados também rastreia as somas de verificação da migração e se as migrações foram ou não bem-sucedidas.
A estrutura executa as seguintes etapas para acomodar os esquemas em evolução do banco de dados:
-
Ele verifica um esquema de banco de dados para localizar sua tabela de metadados (SCHEMA_VERSION por padrão). Se a tabela de metadados não existir, ela criará uma
-
Ele verifica o caminho de classe de um aplicativo em busca de migrações disponíveis
-
Ele compara migrações com a tabela de metadados. Se um número de versão for menor ou igual a uma versão marcada como atual, ele será ignorado
-
Marca as migrações restantes como migrações pendentes. Eles são classificados com base no número da versão e são executados em ordem
-
À medida que cada migração é aplicada, a tabela de metadados é atualizada de acordo
5. Comandos
O Flyway suporta os seguintes comandos básicos para gerenciar migrações de banco de dados.
-
Info: Imprime o status / versão atual de um esquema de banco de dados. Ele imprime quais migrações estão pendentes, quais foram aplicadas, qual é o status das migrações aplicadas e quando elas foram aplicadas.
-
Migrate: Migra um esquema de banco de dados para a versão atual. Ele verifica o caminho de classe em busca de migrações disponíveis e aplica as migrações pendentes.
-
Baseline: Limita um banco de dados existente, excluindo todas as migrações, incluindobaselineVersion. A linha de base ajuda a começar com o Flyway em um banco de dados existente. Migrações mais recentes podem ser aplicadas normalmente.
-
Validate: Valida o esquema do banco de dados atual em relação às migrações disponíveis.
-
Repair: Repara a tabela de metadados.
-
Clean: Descarta todos os objetos em um esquema configurado. Todos os objetos de banco de dados são descartados. Obviamente, você nunca deve usar clean em nenhum banco de dados de produção.
6. Conclusão
Neste artigo, mostramos como o Flyway funciona e como podemos usar essa estrutura para remodelar nosso banco de dados de aplicativos de maneira confiável.
O código que acompanha este artigo está disponível emGithub.