smithery/ngxtm

Ent ORM

Facebook's entity framework for Go with code generation.

Installation

$ npx skills add smithery/ngxtm --skill ent-orm

Also in this package

Other skills from smithery/ngxtm · top by installs.

npx skills add smithery/ngxtm

Browse all from smithery/ngxtm

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Not declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Skill metadata

Parsed from SKILL.md frontmatter.

More metadata
labels
["golang","ent","orm","database"]
triggers
{"files":["ent\/schema\/*.go","ent\/generate.go"],"keywords":["ent","entgo","schema","Field","Edge"]}

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 4,502 B
  • docs SUMMARY.md 71 B

History

  1. First recorded snapshot · 0 installs

SKILL.md

Ent ORM Standards

Schema Definition

// ent/schema/user.go
package schema

import (
    "entgo.io/ent"
    "entgo.io/ent/schema/field"
    "entgo.io/ent/schema/edge"
)

type User struct {
    ent.Schema
}

func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("name").NotEmpty(),
        field.String("email").Unique(),
        field.Int("age").Positive().Optional(),
        field.Time("created_at").Default(time.Now),
        field.Enum("role").Values("admin", "user").Default("user"),
    }
}

func (User) Edges() []ent.Edge {
    return []ent.Edge{
        edge.To("posts", Post.Type),
        edge.To("groups", Group.Type),
    }
}

Code Generation

# Install
go install entgo.io/ent/cmd/ent@latest

# Generate
go generate ./ent

# New schema
ent new User
ent new Post
// ent/generate.go
//go:generate go run -mod=mod entgo.io/ent/cmd/ent generate ./schema
package ent

CRUD Operations

// Create
user, err := client.User.
    Create().
    SetName("John").
    SetEmail("[email protected]").
    Save(ctx)

// Create bulk
users, err := client.User.
    CreateBulk(
        client.User.Create().SetName("A").SetEmail("[email protected]"),
        client.User.Create().SetName("B").SetEmail("[email protected]"),
    ).
    Save(ctx)

// Read
user, err := client.User.Get(ctx, id)
user, err := client.User.Query().
    Where(user.Email("[email protected]")).
    Only(ctx)

// Update
user, err := client.User.
    UpdateOneID(id).
    SetName("Jane").
    Save(ctx)

// Delete
err := client.User.DeleteOneID(id).Exec(ctx)

Queries

// Filter
users, err := client.User.Query().
    Where(
        user.AgeGT(18),
        user.RoleEQ(user.RoleAdmin),
    ).
    All(ctx)

// Or conditions
users, err := client.User.Query().
    Where(
        user.Or(
            user.RoleEQ(user.RoleAdmin),
            user.AgeGT(30),
        ),
    ).
    All(ctx)

// Order and limit
users, err := client.User.Query().
    Order(ent.Desc(user.FieldCreatedAt)).
    Limit(10).
    Offset(20).
    All(ctx)

// Select specific fields
names, err := client.User.Query().
    Select(user.FieldName).
    Strings(ctx)

Edges (Relations)

// Schema with edges
func (Post) Edges() []ent.Edge {
    return []ent.Edge{
        edge.From("author", User.Type).
            Ref("posts").
            Unique().
            Required(),
    }
}

// Query with edges
posts, err := client.User.Query().
    Where(user.ID(id)).
    QueryPosts().
    All(ctx)

// Eager loading
users, err := client.User.Query().
    WithPosts().
    WithGroups().
    All(ctx)

for _, u := range users {
    for _, p := range u.Edges.Posts {
        fmt.Println(p.Title)
    }
}

Transactions

tx, err := client.Tx(ctx)
if err != nil {
    return err
}
defer tx.Rollback()

user, err := tx.User.Create().
    SetName("John").
    Save(ctx)
if err != nil {
    return err
}

_, err = tx.Post.Create().
    SetTitle("First Post").
    SetAuthor(user).
    Save(ctx)
if err != nil {
    return err
}

return tx.Commit()

Hooks

func (User) Hooks() []ent.Hook {
    return []ent.Hook{
        hook.On(
            func(next ent.Mutator) ent.Mutator {
                return hook.UserFunc(func(ctx context.Context, m *ent.UserMutation) (ent.Value, error) {
                    // Before create/update
                    if name, ok := m.Name(); ok {
                        m.SetName(strings.TrimSpace(name))
                    }
                    return next.Mutate(ctx, m)
                })
            },
            ent.OpCreate|ent.OpUpdate,
        ),
    }
}

Migrations

// Auto migration (development)
if err := client.Schema.Create(ctx); err != nil {
    log.Fatalf("failed creating schema: %v", err)
}

// With options
err := client.Schema.Create(ctx,
    migrate.WithDropIndex(true),
    migrate.WithDropColumn(true),
)

// Versioned migrations (production)
// Use Atlas: https://atlasgo.io/

Best Practices

  1. Code generation: Run go generate after schema changes
  2. Edges: Define both sides of relationships
  3. Transactions: Use for related operations
  4. Hooks: For validation, normalization
  5. Migrations: Use Atlas for production