ent para Go: guía completa con ejemplos

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

¿Qué es ent y para qué sirve?

\n\n

ent es una potente biblioteca ORM (Object-Relational Mapping) para el lenguaje Go que utiliza un enfoque de generación de código. A diferencia de las ORM tradicionales, donde escribes estructuras y anotaciones manualmente, ent genera todo el código basándose en tu esquema de datos, descrito en Go.

\n\n

Principales ventajas de ent:

\n
    \n
  • Seguridad de tipos: Todas las consultas se verifican en tiempo de compilación, lo que elimina errores de ejecución relacionados con nombres de campos o tipos incorrectos.
  • \n
  • Generación de código: Describes el esquema una vez, y ent genera todas las estructuras necesarias, constructores de consultas, migraciones e incluso pruebas.
  • \n
  • Rendimiento: El código generado está optimizado y no utiliza reflexión, lo que lo hace más rápido que muchas otras ORM.
  • \n
  • Consultas en grafo: ent permite realizar fácilmente consultas con carga de entidades relacionadas (Eager Loading) y construir consultas complejas en grafo.
  • \n
  • Soporte para múltiples bases de datos: MySQL, PostgreSQL, SQLite, Gremlin (para bases de datos en grafo) y otras.
  • \n
\n\n

ent es ideal para proyectos donde la confiabilidad, el rendimiento y la tipificación estricta son importantes. Se utiliza a menudo en arquitectura de microservicios, sistemas de alta carga y proyectos que requieren una estructura de datos clara.

\n\n

Instalación

\n\n

La instalación de ent incluye dos componentes: el paquete en sí y la herramienta CLI para la generación de código.

\n\n
# Instalación de la herramienta CLI (una vez)\ngo install entgo.io/ent/cmd/ent@latest\n\n# Inicialización del proyecto (creación de la carpeta ent y el esquema)\nent init User\n\n# Instalación de dependencias\ngo mod tidy\n
\n\n

Después de ejecutar estos comandos, tendrás una carpeta ent/ con el archivo schema/user.go, donde describirás el esquema de datos.

\n\n

Inicio rápido con ejemplo de código

\n\n

Vamos a crear un modelo de usuario simple y aprender a realizar operaciones básicas.

\n\n

1. Descripción del esquema (ent/schema/user.go)

\n\n
package schema\n\nimport (\n    "entgo.io/ent"\n    "entgo.io/ent/schema/field"\n)\n\n// User holds the schema definition for the User entity.\ntype User struct {\n    ent.Schema\n}\n\n// Fields of the User.\nfunc (User) Fields() []ent.Field {\n    return []ent.Field{\n        field.String("name").\n            NotEmpty().\n            Unique(),\n        field.Int("age").\n            Positive(),\n        field.String("email").\n            Unique(),\n    }\n}\n
\n\n

2. Generación de código

\n\n
go generate ./ent\n
\n\n

Este comando creará todos los archivos necesarios: cliente, constructores de consultas, migraciones, etc.

\n\n

3. Uso en main.go

\n\n
package main\n\nimport (\n    "context"\n    "fmt"\n    "log"\n\n    "your-project/ent"\n    "your-project/ent/user"\n    _ "github.com/mattn/go-sqlite3"\n)\n\nfunc main() {\n    // Creamos un cliente para SQLite (en memoria)\n    client, err := ent.Open("sqlite3", "file:ent?mode=memory&cache=shared&_fk=1")\n    if err != nil {\n        log.Fatalf("failed opening connection to sqlite: %v", err)\n    }\n    defer client.Close()\n\n    // Automigración\n    ctx := context.Background()\n    if err := client.Schema.Create(ctx); err != nil {\n        log.Fatalf("failed creating schema resources: %v", err)\n    }\n\n    // Creación de usuario\n    newUser, err := client.User.\n        Create().\n        SetName("Alice").\n        SetAge(30).\n        SetEmail("alice@example.com").\n        Save(ctx)\n    if err != nil {\n        log.Fatalf("failed creating user: %v", err)\n    }\n    fmt.Println("Created user:", newUser.ID)\n\n    // Consulta de usuario por nombre\n    foundUser, err := client.User.\n        Query().\n        Where(user.Name("Alice")).\n        Only(ctx)\n    if err != nil {\n        log.Fatalf("failed querying user: %v", err)\n    }\n    fmt.Printf("Found use                    

Recommendations