ent for Go: Complete Guide with Examples

Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

What is ent and why is it needed?

\n\n

ent is a powerful ORM (Object-Relational Mapping) library for the Go language that uses a code generation approach. Unlike traditional ORMs where you manually write structures and annotations, ent generates all the code based on your data schema described in Go.

\n\n

Main advantages of ent:

\n
    \n
  • Type safety: All queries are checked at compile time, eliminating runtime errors related to incorrect field names or types.
  • \n
  • Code generation: You describe the schema once, and ent generates all necessary structures, query builders, migrations, and even tests.
  • \n
  • Performance: The generated code is optimized and does not use reflection, making it faster than many other ORMs.
  • \n
  • Graph queries: ent allows you to easily perform queries with eager loading of related entities and build complex graph queries.
  • \n
  • Multiple database support: MySQL, PostgreSQL, SQLite, Gremlin (for graph databases), and others.
  • \n
\n\n

ent is ideal for projects where reliability, performance, and strict typing are important. It is often used in microservice architecture, high-load systems, and projects requiring a clear data structure.

\n\n

Installation

\n\n

Installing ent includes two components: the package itself and the CLI tool for code generation.

\n\n
# Install CLI tool (once)\ngo install entgo.io/ent/cmd/ent@latest\n\n# Initialize project (creates ent folder and schema)\nent init User\n\n# Install dependencies\ngo mod tidy\n
\n\n

After executing these commands, you will have an ent/ folder with a schema/user.go file where you will describe the data schema.

\n\n

Quick start with code example

\n\n

Let's create a simple user model and learn how to perform basic operations.

\n\n

1. Schema description (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. Code generation

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

This command creates all necessary files: client, query builders, migrations, etc.

\n\n

3. Usage in 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    // Create client for SQLite (in memory)\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    // Auto migration\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    // Create user\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    // Query user by name\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