Pular para o conteúdo principal

victorstein.dev

87/100 Dias de Golang - Migrações de Banco de Dados em Produção com Goose

Table of Contents

# Migrações de Banco de Dados em Produção com Goose

No desenvolvimento de aplicações reais, a modelagem do banco de dados não é uma etapa única. À medida que novas funcionalidades são implementadas, o esquema do banco precisa evoluir – e garantir que essa evolução ocorra de forma previsível, segura e versionada é o papel das migrações de bancos de dados. Não lembro exatamente em qual post, mas já utilizamos o db.AutoMigrate do GORM para criar as tabelas, essa ferramenta é muito útile e prática, mas ela não atende bem a demandas de ambientes de produção. É aqui que entram ferramentas dedicadas, como o Goose - Leiam a documentação da biblioteca, ela é muito boa. E a logo é melhor ainda:

Logo da Goose

go install github.com/pressly/goose/v3/cmd/goose@latest

Para verificar se o goose foi instalado:

goose --help

Agora vamos criar um novo arquivo com o goose:

goose -dir ./db/migrations postgres "user=postgres dbname=ci_cd sslmode=disable" create create_users_table sql

Esse comando irá criar um arquivo dentro da pasta migrations:

-- +goose Up
-- +goose StatementBegin
SELECT 'up SQL query';
-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin
SELECT 'down SQL query';
-- +goose StatementEnd

Vamos editar esse arquivo e colar o seguinte:

-- +goose Up
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  email TEXT UNIQUE NOT NULL
);

-- +goose Down
DROP TABLE users;

Na documentação fala que devemos ter cuidado com os comentário e os espaços em branco, pois o goose usará esse comentário para saber o que executar em cada comando.

Agora podemos exeutar a migration:

goose -dir ./db/migrations postgres "user=postgres dbname=ci_cd sslmode=disable" up

Ou reverter:

goose down

O Goose cria automaticamente uma tabela chamada goose_db_version, onde registra: número da migração aplicada e data/hora de execução. Isso evita reexecuções e permite controle transacional da evolução do esquema.

A questão do Goose é que temos que escrever as migrations - Ou pode ser que não pesquisei o suficiente. Mas gostaria de alguma coisa mais “automática”, tipo o ORM do Django no Python. Escrevemos as entidades no Python e ele cria e gerencia de forma automática as migrations. Vi que em Go temos outras opções, Ent, golang-migrate e Atlas (é pago e tem algumas limitações na versão free).