ORM para Go (Golang): comparação e exemplos de bibliotecas populares

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

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

Recommendations