ORM para Go (Golang): comparación y ejemplos de bibliotecas populares

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

ORM para Go (Golang): reseña, comparación y ejemplos prácticos



Go (Golang) es famoso por su rendimiento y simplicidad, pero trabajar con bases de datos a menudo requiere escribir una gran cantidad de código SQL repetitivo. Las bibliotecas ORM (Object-Relational Mapping) están diseñadas para simplificar la interacción con la BD, automatizando el mapeo de estructuras Go a tablas. En este artículo, revisaremos los tres ORM más populares para Go: GORM, Ent y SQLBoiler, los compararemos según parámetros clave y proporcionaremos ejemplos funcionales.



1. GORM — el ORM más popular para Go



GORM es un ORM con todas las funciones, con una comunidad activa y una gran cantidad de características: migraciones, hooks, precarga de relaciones, transacciones y mucho más. Funciona bajo el principio de "convention over configuration" y es compatible con la mayoría de los SGBD populares (PostgreSQL, MySQL, SQLite).



Ventajas:

  • Inicio rápido: configuración mínima, creación automática de tablas.
  • Ecosistema rico: plugins, loggers, validadores.
  • Soporte para asociaciones (Belongs To, Has Many, Many2Many).


Desventajas:

  • Rendimiento medio debido a la reflexión y generación de SQL sobre la marcha.
  • Dificultades para optimizar consultas complejas (problema N+1).


Ejemplo de uso de 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() { // Conexión a SQLite db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) if err != nil { panic("failed to connect database") }

// Automigración — creación de tabla db.AutoMigrate(&User{})

// Crear registro db.Create(&User{Name: "Iván", Age: 30})

// Lectura var user User db.First(&user, 1) // buscar por ID db.First(&user, "name = ?", "Iván") // buscar por condición

// Actualización db.Model(&user).Update("Age", 31)

// Eliminación db.Delete(&user)}


2. Ent — ORM de Facebook con generación de código



Ent es un ORM moderno que genera código Go tipado basado en un esquema de datos descrito en estructuras Go. Ofrece tipado estricto, excelente rendimiento y una potente API de grafos para consultas. Ent se desarrolla activamente y se utiliza en grandes proyectos (por ejemplo, en el propio Facebook).



Ventajas:

  • Generación de código: errores en tiempo de compilación, no en tiempo de ejecución.
  • Alto rendimiento gracias al SQL estático.
  • API conveniente para construir consultas complejas con filtrado y ordenación.


Desventajas:

  • Necesidad de instalar la herramienta CLI y generar código.
  • Curva de aprendizaje más pronunciada en comparación con GORM.


Ejemplo de uso de Ent:

package main

import ( "context" "log"

"entgo.io/ent/dialect/sqlite" "github.com/yourproject/ent" "github.com/yourproject/ent/user")

func main() { // Conexión a 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()

// Automigración if err := client.Schema.Create(context.Background()); err != nil { log.Fatalf("failed creating schema resources: %v", err) }

// Crear usuario createdUser, err := client.User.Create(). SetName("Pedro"). SetAge(25). Save(context.Background()) if err != nil { log.Fatalf("failed creating user: %v", err) }

// Consulta con filtrado users, err := client.User.Q

Recommendations