migrate para Go: guia completo com exemplos práticos
A biblioteca migrate é uma ferramenta poderosa e flexível para gerenciar migrações de banco de dados no ecossistema Go. Ela permite que desenvolvedores versionem alterações no esquema do banco, apliquem e revertam migrações automaticamente, além de se integrar com diversos SGBDs, incluindo PostgreSQL, MySQL, SQLite, MongoDB, CockroachDB e outros. Neste artigo, vamos explorar detalhadamente como usar o migrate em Go, desde a instalação até técnicas avançadas.
O que é e por que usar
Durante o desenvolvimento de qualquer aplicação que interage com um banco de dados, mais cedo ou mais tarde surge a necessidade de alterar a estrutura das tabelas: adicionar uma nova coluna, criar um índice, modificar um tipo de dado ou renomear uma tabela. Se você trabalha em equipe ou implanta a aplicação em vários ambientes (desenvolvimento, staging, produção), executar scripts SQL manualmente se torna uma fonte de erros e inconsistências.
A biblioteca migrate resolve esse problema oferecendo uma maneira simples e declarativa de descrever as alterações no esquema. Cada migração é um par de arquivos: um para aplicar as alterações (up) e outro para reverter (down). A biblioteca monitora quais migrações já foram aplicadas e permite navegar com segurança para frente ou para trás no histórico de alterações.
Principais vantagens de usar o migrate:
- Versionamento: cada migração possui um número ou timestamp único, permitindo saber exatamente qual versão do esquema está em uso.
- Reprodutibilidade: você pode configurar um banco de dados do zero aplicando todas as migrações sequencialmente.
- Segurança: a presença de migrações down permite reverter alterações em caso de erro.
- Independência de linguagem: as migrações são escritas em SQL puro, tornando-as portáveis entre projetos em diferentes linguagens.
Instalação
Para instalar a biblioteca migrate em Go, use o comando padrão go get. Recomenda-se instalá-la como dependência do seu projeto:
go get -u github.com/golang-migrate/migrate/v4
Você também precisará instalar o driver para o seu banco de dados. Por exemplo, para PostgreSQL:
go get -u github.com/golang-migrate/migrate/v4/database/postgres
Para MySQL:
go get -u github.com/golang-migrate/migrate/v4/database/mysql
Para SQLite:
go get -u github.com/golang-migrate/migrate/v4/database/sqlite3
Além disso, você precisará de um driver para a fonte das migrações. O mais comum é o sistema de arquivos:
go get -u github.com/golang-migrate/migrate/v4/source/file
Também estão disponíveis drivers para io/fs, github, gitlab, s3 e outras fontes.
Início rápido — exemplo mínimo funcional
Vamos criar uma aplicação simples que se conecta a um banco SQLite e aplica migrações.
Primeiro, crie a estrutura de pastas para as migrações:
mkdir -p migrations
cd migrations
Crie a primeira migração. O nome do arquivo deve seguir o padrão: {versão}_{nome}.{direção}.sql. A versão geralmente é um timestamp ou um número sequencial.
Arquivo: migrations/000001_create_users_table.up.sql
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Arquivo: migrations/000001_create_users_table.down.sql
DROP TABLE IF EXISTS users; Também na biblioteca
Cliente Redis para Rust: visão geral da biblioteca redis-rs
Trabalhando com Apache Kafka em C# (.NET): biblioteca Confluent.Kafka
CoreBluetooth para Swift: Guia completo com exemplos práticos
Trabalhando com Kafka em TypeScript: biblioteca KafkaJS para Node.js
golangci-lint para Go: guia completo com exemplos