Tecnologia
Versionar sua base de dados com Spring Boot e Flyway
3 minutos de leitura
![](https://cwi.com.br/wp-content/uploads/2021/03/nat3_1.png)
Fala galera! Quem nunca precisou versionar a base de dados de uma aplicação? Bom, decidi fazer esse pequeno artigo para lhe mostrar o quão fácil isso é com o Spring Boot utilizando o Flyway. Isso mesmo, vamos utilizar os migrations, muito conhecidos em vários framewoks, independente da linguagem, para versionamento de banco de dados.
Primeiro vamos usar o https://start.spring.io/ para baixar o nosso projeto:
![](https://cwi.com.br/wp-content/uploads/2021/03/nat3_2-1024x578.png)
Repare nas dependências que vamos colocar:
- Spring Web, para rodarmos dois endpoints simples;
- Lombok, porque não vamos ficar escrevendo o que ele pode escrever para nós;
- Flyway Migration, a dependência que de fato fará os nossos migrations;
- PostgreSQL Driver no meu caso porque estou conectando em um banco Postgres. Caso queira usar outro, fique à vontade;
- Spring Data JPA, para usarmos uma consulta e cadastro simples;
Agora vamos criar uma classe simples de usuário:
package com.example.migration;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Data
@Builder
@Entity
@AllArgsConstructor
@NoArgsConstructor
public class Usuario {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String nome;
private Long idade;
}
Repare que temos apenas 3 campos: id, nome e idade. Depois, vamos criar a nossa Repository:
package com.example.migration;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UsuarioRepository extends JpaRepository<Usuario, Long> {
}
E, finalmente, nossa controller com dois endpoints simples:
package com.example.migration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("usuario")
public class UsuarioController {
@Autowired
UsuarioRepository usuarioRepository;
@GetMapping
public List<Usuario> listAll(){
return usuarioRepository.findAll();
}
@PostMapping
public Usuario save(@RequestBody Usuario usuario){
return usuarioRepository.save(usuario);
}
}
Para facilitar nossa vida acessando os endpoints criados, vamos colocar a dependência do swagger em nosso pom.xml:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
Assim, subindo a nossa aplicação, basta acessar a url: http://localhost:8080/swagger-ui/, que vamos ver os dois enpoints que criamos na UsuarioController.
![](https://cwi.com.br/wp-content/uploads/2021/03/nat3_3-1024x545.png)
Feito isso galera, vamos para as configurações de banco de dados. No meu caso, criei uma base de dados Postgres no Heroku. Seu application.properties deve ficar assim:
spring.datasource.url=jdbc:postgresql://hostdoseubanco:5432/nomedoseubanco?currentSchema=public
spring.datasource.username=seuusuario
spring.datasource.password=senhadoseubanco
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL9Dialect
Agora no diretório src/main/resources/db/migration/V1__criar_usuario.sql, criei o meu primeiro script de banco de dados, criando a minha tabela usuario:
CREATE TABLE usuario (
id int8 NOT NULL,
nome varchar(255) NOT NULL,
idade integer NOT NULL,
CONSTRAINT usuario_pkey PRIMARY KEY (id)
);
insert into usuario(id, nome, idade) values (1, 'Nataniel', 29);
Feito isso, quando eu subir a aplicação, ela vai criar na minha base de dados a tabela usuario e inserir um registro nela. Até aí, nada demais. Porém, imagine que agora apareceu um requisito novo, e você precisa adicionar outra coluna chamada cpf na tabela usuario. Para isso, basta fazer a V2 e criar o script na base de dados para fazer o alter table. Segue um exemplo de alter table:
ALTER TABLE usuario ADD cpf varchar(13) NULL;
Não esqueça de mapear o novo campo na sua classe de Usuario:
package com.example.migration;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Data
@Builder
@Entity
@AllArgsConstructor
@NoArgsConstructor
public class Usuario {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "increment")
private Long id;
private String nome;
private Long idade;
private String cpf;
}
Agora, olhando o nosso swagger, veja os dados:
![](https://cwi.com.br/wp-content/uploads/2021/03/nat3_4-1024x561.png)
Vamos adicionar mais um registro com CPF, utilizando o nosso próprio endpoint de cadastrar pelo swagger mesmo:
![](https://cwi.com.br/wp-content/uploads/2021/03/nat3_5-1024x549.png)
Feito isso, nossa lista tem os dois registros:
![](https://cwi.com.br/wp-content/uploads/2021/03/nat3_6-1024x507.png)
É isso galera! Espero que tenha ajudado alguém, qualquer dúvida o código está no meu repo do github: https://github.com/natanielpaiva/exemplo-spring-flyway
Abraços e até o próximo artigo!