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:
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).