Ir para o conteúdo

Versionar sua base de dados com Spring Boot e Flyway

3 min. de leitura

Avatar de Nataniel Freire de Paiva Amorim

Nataniel Freire de Paiva Amorim Autor


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:

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.

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:

Vamos adicionar mais um registro com CPF, utilizando o nosso próprio endpoint de cadastrar pelo swagger mesmo:

Feito isso, nossa lista tem os dois registros:

É 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!