Calude Code编写的Ent ORM 完整指南

本文由claude code生成。作为备忘录和分享,欢迎指正和补充。

一、Ent简介

Ent是一个简单但功能强大的实体框架,用于Go语言,使构建和维护具有大型数据模型的应用程序变得容易。 Ent是由Meta(Facebook)开源团队构建的ORM框架,提供了一个API,用于将任何数据库模式建模为Go对象。

核心特性

Ent的主要特性包括:

  • Schema As Code:将任何数据库模式建模为Go对象
  • 轻松遍历任何图结构:运行查询、聚合并轻松遍历任何图结构
  • 静态类型和显式API:100%静态类型和显式API,通过代码生成实现
  • 多存储驱动支持:支持MySQL、PostgreSQL、SQLite和Gremlin
  • 易于扩展:使用Go模板简单扩展和自定义

Ent是一个相当新的ORM,使用代码优先的方法,在Go代码中定义模式。Ent之所以流行,是因为它能够优雅地处理复杂的数据模型和关系。

二、快速开始

2.1 安装Ent

# 初始化Go模块
go mod init myapp

# 安装ent CLI工具
go install entgo.io/ent/cmd/ent@latest

# 或者使用go get
go get entgo.io/ent/cmd/ent

2.2 创建第一个Schema

# 创建User实体
ent new User

这会在 ent/schema/ 目录下生成一个基础的schema文件:

package schema

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

// User holds the schema definition for the User entity.
type User struct {
    ent.Schema
}

// Fields of the User.
func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("name").
            NotEmpty(),
        field.Int("age").
            Positive(),
        field.String("email").
            Unique(),
        field.Time("created_at").
            Default(time.Now),
    }
}

// Edges of the User.
func (User) Edges() []ent.Edge {
    return nil
}

2.3 生成代码

go generate ./ent

2.4 连接数据库并使用

package main

import (
    "context"
    "log"

    "myapp/ent"

    _ "github.com/lib/pq"           // PostgreSQL
    // _ "github.com/go-sql-driver/mysql"  // MySQL
    // _ "github.com/mattn/go-sqlite3"     // SQLite
)

func main() {
    // 连接PostgreSQL
    client, err := ent.Open("postgres",
        "host=localhost port=5432 user=postgres dbname=myapp password=password sslmode=disable")
    if err != nil {
        log.Fatalf("failed opening connection to postgres: %v", err)
    }
    defer client.Close()

    // 运行自动迁移
    if err := client.Schema.Create(context.Background()); err != nil {
        log.Fatalf("failed creating schema resources: %v", err)
    }

    ctx := context.Background()

    // 创建用户
    user, err := client.User.
        Create().
        SetName("张三").
        SetAge(30).
        SetEmail("zhangsan@example.com").
        Save(ctx)
    if err != nil {
        log.Fatalf("failed creating user: %v", err)
    }
    log.Println("user was created: ", user)
}

2.5 使用SQLite3(非CGO驱动)

📋 使用场景

为什么使用非CGO的SQLite驱动?

添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论