什么是 ent,为什么需要它?
\n\nent 是一个用于 Go 语言的强大 ORM(对象关系映射)库,它采用代码生成的方法。与传统的 ORM 不同,传统 ORM 需要您手动编写结构和注解,而 ent 会根据您在 Go 中描述的数据模式生成所有代码。
\n\nent 的主要优势:
\n- \n
- 类型安全: 所有查询在编译阶段进行检查,从而消除了因字段名或类型错误导致的运行时错误。 \n
- 代码生成: 您只需描述一次模式,ent 就会生成所有必要的结构、查询构建器、迁移甚至测试代码。 \n
- 性能: 生成的代码经过优化,不使用反射,因此比许多其他 ORM 更快。 \n
- 图查询: ent 允许您轻松执行加载关联实体的查询(预加载),并构建复杂的图查询。 \n
- 支持多种数据库: MySQL、PostgreSQL、SQLite、Gremlin(用于图数据库)等。 \n
ent 非常适合那些重视可靠性、性能和严格类型化的项目。它常用于微服务架构、高负载系统以及需要清晰数据结构的项目。
\n\n安装
\n\n安装 ent 包括两个组件:包本身和用于代码生成的 CLI 工具。
\n\n# 安装 CLI 工具(一次)\ngo install entgo.io/ent/cmd/ent@latest\n\n# 初始化项目(创建 ent 文件夹和模式)\nent init User\n\n# 安装依赖\ngo mod tidy\n\n\n执行这些命令后,您将得到一个 ent/ 文件夹,其中包含 schema/user.go 文件,您将在其中描述数据模式。
快速入门与代码示例
\n\n让我们创建一个简单的用户模型,并学习如何执行基本操作。
\n\n1. 描述模式 (ent/schema/user.go)
\n\npackage 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\n2. 生成代码
\n\ngo generate ./ent\n\n\n此命令将创建所有必要的文件:客户端、查询构建器、迁移等。
\n\n3. 在 main.go 中使用
\n\npackage 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 // 为 SQLite 创建客户端(内存中)\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 // 自动迁移\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 // 创建用户\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 // 按名称查询用户\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