goose para Go: guia completo com exemplos práticos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

goose para Go: guia completo com exemplos práticos

O que é e para que serve

A biblioteca goose (Go Object-Oriented SQL Environment) é uma ferramenta poderosa para gerenciar migrações de banco de dados no ecossistema Go. Diferente de soluções embutidas, o goose oferece uma abordagem declarativa para versionamento de esquemas de banco de dados, permitindo que desenvolvedores descrevam alterações em SQL ou código Go. O principal objetivo do goose é automatizar o processo de aplicar e reverter alterações na estrutura do banco de dados, algo essencial para desenvolvimento em equipe e pipelines de CI/CD.

Por que usar goose? Primeiro, ela resolve o problema de sincronização do esquema do banco entre desenvolvedores: cada membro da equipe pode aplicar as migrações mais recentes com um único comando. Segundo, o goose suporta versionamento — cada migração tem um número único, permitindo identificar exatamente quais alterações já foram aplicadas. Terceiro, a biblioteca funciona com diversos SGBDs (PostgreSQL, MySQL, SQLite, ClickHouse e outros) através de uma interface unificada, facilitando a troca entre ambientes.

A principal vantagem do goose sobre alternativas (como golang-migrate/migrate) é o suporte a migrações em Go, não apenas em SQL. Você pode escrever migrações complexas com lógica de negócios, usar transações e acessar APIs externas. Além disso, o goose oferece suporte nativo a embed (incorporação de migrações no binário), ideal para ambientes de produção.

Instalação

A instalação do goose é feita através do gerenciador de pacotes padrão do Go. Certifique-se de ter o Go versão 1.18 ou superior instalado.

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

Após a instalação, verifique a versão:

goose --version

Para usar o goose como biblioteca no seu projeto, adicione a dependência:

go get github.com/pressly/goose/v3

Você também precisará do driver para o seu SGBD. Por exemplo, para PostgreSQL:

go get github.com/lib/pq

Para MySQL:

go get github.com/go-sql-driver/mysql

Para SQLite:

go get github.com/mattn/go-sqlite3

Início rápido — exemplo mínimo funcional

Vamos criar um projeto simples para demonstrar as funcionalidades básicas do goose.

1. Crie o diretório do projeto e inicialize o módulo:

mkdir goose-demo && cd goose-demo
go mod init goose-demo

2. Crie um diretório para as migrações:

mkdir migrations

3. Crie a primeira migração em SQL. Arquivo migrations/001_create_users.sql:

-- +goose Up
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

-- +goose Down
DROP TABLE users;

4. Crie o arquivo main.go para executar as migrações programaticamente:

package main

import (
    "database/sql"
    "embed"
    "log"

    "github.com/pressly/goose/v3"
    _ "github.com/lib/pq"
)

//go:embed migrations/*.sql
var migrations embed.FS

func main() {
    // Conexão com o banco de dados
    db, err := sql.Open("postgres", "host=localhost port=5432 user=postgres password=postgres dbname=testdb sslmode=disable")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // Define a fonte das migrações a partir do embed.FS
    goose.SetBaseFS(migrations)

    // Executa as migrações até a versão mais recente
    if err := goose.Up(db, "migrations"); err != nil {
        log.Fa                    

Recommendations