🧩 Exercícios: Migrações e Versionamento de Banco de Dados
Spec Backend Com Golang E Gin • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 08.1 — Execução de AutoMigrate de Múltiplos Modelos
Contexto: Execução de AutoMigrate de Múltiplos Modelos no contexto de Migrações e Versionamento de Banco de Dados.
Requisitos de Execução:
- Criar rotina de migração declarativa que registre e sincronize todas as structs do sistema.
Resultado Esperado
AutoMigrate sincronizou 5 tabelas no banco de dados.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_08_1_SeuNome - Envie na tarefa:
Atividade Cap 08 - Migrações e Versionamento de Banco de Dados
🔑 Gabarito de Código & Solução Comentada
// migrations/automigrate.go
package migrations
import (
"gorm.io/gorm"
"espec_backend_go_gin/models"
)
func RunAutoMigrate(db *gorm.DB) error {
return db.AutoMigrate(
&models.Produto{},
&models.ClienteComPedidos{},
&models.Pedido{},
)
}
🔍 Nível 2: Prática
Problema 08.2 — Migração Baseada em Arquivos SQL com golang-migrate
Contexto: Migração Baseada em Arquivos SQL com golang-migrate no contexto de Migrações e Versionamento de Banco de Dados.
Requisitos de Execução:
- Configurar biblioteca
golang-migratepara aplicar arquivos de migração.up.sqle.down.sql.
Resultado Esperado
Migração '000001_criar_tabela_usuarios.up.sql' aplicada com sucesso.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_08_2_SeuNome - Envie na tarefa:
Atividade Cap 08 - Migrações e Versionamento de Banco de Dados
🔑 Gabarito de Código & Solução Comentada
// sql_migrate.go
package main
import (
"database/sql"
"github.com/golang-migrate/migrate/v4"
"github.com/golang-migrate/migrate/v4/database/sqlite3"
_ "github.com/golang-migrate/migrate/v4/source/file"
)
func ExecutarMigracoesSQL(db *sql.DB) error {
driver, err := sqlite3.WithInstance(db, &sqlite3.Config{})
if err != nil { return err }
m, err := migrate.NewWithDatabaseInstance("file://migrations", "sqlite3", driver)
if err != nil { return err }
return m.Up()
}
⚡ Nível 3: Integração
Problema 08.3 — Seed de Dados Iniciais (Data Seeding) com Idempotência
Contexto: Seed de Dados Iniciais (Data Seeding) com Idempotência no contexto de Migrações e Versionamento de Banco de Dados.
Requisitos de Execução:
- Criar rotina de seed que popule dados de admin e papéis padrão apenas se a tabela estiver vazia.
Resultado Esperado
Seeding idempotente concluído: 1 usuário admin padrão inserido.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_08_3_SeuNome - Envie na tarefa:
Atividade Cap 08 - Migrações e Versionamento de Banco de Dados
🔑 Gabarito de Código & Solução Comentada
// seeding.go
package main
import (
"gorm.io/gorm"
"espec_backend_go_gin/models"
)
func SeedDadosIniciais(db *gorm.DB) error {
var count int64
db.Model(&models.Produto{}).Count(&count)
if count == 0 {
prodPadrao := models.Produto{Nome: "Produto Inicial", Preco: 99.0, SKU: "INIT-01"}
return db.Create(&prodPadrao).Error
}
return nil
}
🏆 Nível 4: Desafio Corporativo
Problema 08.4 — Controle de Versão de Migrações em Pipeline CI/CD
Contexto: Controle de Versão de Migrações em Pipeline CI/CD no contexto de Migrações e Versionamento de Banco de Dados.
Requisitos de Execução:
- Criar comando CLI para verificar a versão atual da migração e abortar build se houver drift no schema.
Resultado Esperado
Verificação de integridade de migrações aprovada.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_08_4_SeuNome - Envie na tarefa:
Atividade Cap 08 - Migrações e Versionamento de Banco de Dados
🔑 Gabarito de Código & Solução Comentada
// check_version.go
package main
import "log"
func VerificarSchemaVersion(versaoEsperada int, versaoAtual int) bool {
if versaoAtual != versaoEsperada {
log.Printf("ERRO: Drift detectado! Esperado: %d, Atual: %d", versaoEsperada, versaoAtual)
return false
}
log.Println("Schema version 100% alinhado com a HEAD.")
return true
}