ORM para Go (Golang): visão geral, comparação e exemplos práticos
Go (Golang) é conhecido por seu desempenho e simplicidade, mas trabalhar com bancos de dados frequentemente exige escrever muito código SQL repetitivo. As bibliotecas ORM (Object-Relational Mapping) visam simplificar a interação com o banco de dados, automatizando o mapeamento de estruturas Go para tabelas. Neste artigo, veremos as três ORMs mais populares para Go: GORM, Ent e SQLBoiler, comparando-as em parâmetros-chave e fornecendo exemplos práticos.
1. GORM — a ORM mais popular para Go
GORM é uma ORM completa com uma comunidade ativa e uma vasta gama de recursos: migrações, hooks, pré-carregamento de relacionamentos, transações e muito mais. Ela funciona com o princípio "convenção sobre configuração" e suporta a maioria dos SGBDs populares (PostgreSQL, MySQL, SQLite).
Vantagens:
- Início rápido: configuração mínima, criação automática de tabelas.
- Ecossistema rico: plugins, loggers, validadores.
- Suporte a associações (Belongs To, Has Many, Many2Many).
Desvantagens:
- Desempenho mediano devido ao uso de reflexão e geração de SQL em tempo real.
- Dificuldades com otimização de consultas complexas (problema N+1).
Exemplo de uso do GORM:
package main
import ( "gorm.io/driver/sqlite" "gorm.io/gorm")
type User struct { ID uint `gorm:"primaryKey"` Name string `gorm:"size:100"` Age int}
func main() { // Conexão com SQLite db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { panic("failed to connect database") }
// Automigração — criação da tabela db.AutoMigrate(&User{})
// Criar registro db.Create(&User{Name: "Иван", Age: 30})
// Leitura var user User db.First(&user, 1) // encontrar por ID db.First(&user, "name = ?", "Иван") // encontrar por condição
// Atualização db.Model(&user).Update("Age", 31)
// Exclusão db.Delete(&user)}2. Ent — ORM do Facebook com geração de código
Ent é uma ORM moderna que gera código Go tipado com base em um esquema de dados descrito em estruturas Go. Ela oferece tipagem estrita, excelente desempenho e uma poderosa API baseada em grafos para consultas. Ent está em desenvolvimento ativo e é usada em grandes projetos (por exemplo, no próprio Facebook).
Vantagens:
- Geração de código: erros em tempo de compilação, não em tempo de execução.
- Alto desempenho devido ao SQL estático.
- API conveniente para construir consultas complexas com filtragem e ordenação.
Desvantagens:
- Necessidade de instalar uma ferramenta CLI e gerar código.
- Curva de aprendizado mais íngreme em comparação com GORM.
Exemplo de uso do Ent:
package main
import ( "context" "log"
"entgo.io/ent/dialect/sqlite" "github.com/yourproject/ent" "github.com/yourproject/ent/user")
func main() { // Conexão com SQLite client, err := ent.Open("sqlite3", "file:ent.db?cache=shared&_fk=1") if err != nil { log.Fatalf("failed opening connection to sqlite: %v", err) } defer client.Close()
// Automigração if err := client.Schema.Create(context.Background()); err != nil { log.Fatalf("failed creating schema resources: %v", err) }
// Criar usuário createdUser, err := client.User.Create(). SetName("Пётр"). SetAge(25). Save(context.Background()) if err != nil { log.Fatalf("failed creating user: %v", err) }
// Consulta com filtragem users, err := client.User.Q Também na biblioteca
Guia completo de gRPC Java: exemplos práticos e instalação
Processamento de JSON em PHP: funções, exemplos e melhores práticas
Rate limiting em Rust: bibliotecas governor, leaky-bucket e middleware para servidores web
Gerador de QR Codes em C# (.NET) com QRCoder
Framework CLI para Rust: guia completo para desenvolvimento de utilitários