id: crud

title: CRUD API

代码生成 部分描述的那样,定义好模式后,运行 entc 可以生成以下内容

  • 用于和图(数据库)交互的 ClientTx.
  • 每个模式的增查改删(CRUD)构建器,查看 增查改删API 详情。
  • 每个模式的实体 (Go struct).
  • 包含用于和构建器交互的常量和条件查询方法。
  • 为 SQL 提供的 migrate 包. 查看 数据库迁移 详情。

创建一个客户端

MySQL

  1. package main
  2. import (
  3. "log"
  4. "<project>/ent"
  5. _ "github.com/go-sql-driver/mysql"
  6. )
  7. func main() {
  8. client, err := ent.Open("mysql", "<user>:<pass>@tcp(<host>:<port>)/<database>?parseTime=True")
  9. if err != nil {
  10. log.Fatal(err)
  11. }
  12. defer client.Close()
  13. }

SQLite

  1. package main
  2. import (
  3. "log"
  4. "<project>/ent"
  5. _ "github.com/mattn/go-sqlite3"
  6. )
  7. func main() {
  8. client, err := ent.Open("sqlite3", "file:ent?mode=memory&cache=shared&_fk=1")
  9. if err != nil {
  10. log.Fatal(err)
  11. }
  12. defer client.Close()
  13. }

Gremlin (AWS Neptune)

  1. package main
  2. import (
  3. "log"
  4. "<project>/ent"
  5. )
  6. func main() {
  7. client, err := ent.Open("gremlin", "http://localhost:8182")
  8. if err != nil {
  9. log.Fatal(err)
  10. }
  11. }

创建

创建一个实体。

Save 创建一个用户.

  1. a8m, err := client.User. // UserClient.
  2. Create(). // User create builder.
  3. SetName("a8m"). // Set field value.
  4. SetNillableAge(age). // Avoid nil checks.
  5. AddGroups(g1, g2). // Add many edges.
  6. SetSpouse(nati). // Set unique edge.
  7. Save(ctx) // Create and return.

SaveX 创建一个用户;不同于 Save, SaveX 遇到错误时会引起 panics.

  1. pedro := client.Pet. // PetClient.
  2. Create(). // User create builder.
  3. SetName("pedro"). // Set field value.
  4. SetOwner(a8m). // Set owner (unique edge).
  5. SaveX(ctx) // Create and return.

更新

更新一个数据库返回的实体。

  1. a8m, err = a8m.Update(). // User update builder.
  2. RemoveGroup(g2). // Remove specific edge.
  3. ClearCard(). // Clear unique edge.
  4. SetAge(30). // Set field value
  5. Save(ctx) // Save and return.

根据 ID 更新

根据 ID 更新一个实体。

  1. pedro, err := client.Pet. // PetClient.
  2. UpdateOneID(id). // Pet update builder.
  3. SetName("pedro"). // Set field name.
  4. SetOwnerID(owner). // Set unique edge, using id.
  5. Save(ctx) // Save and return.

更新多个

根据条件过滤更新多个实体。

  1. n, err := client.User. // UserClient.
  2. Update(). // Pet update builder.
  3. Where( //
  4. user.Or( // (age >= 30 OR name = "bar")
  5. user.AgeEQ(30), //
  6. user.Name("bar"), // AND
  7. ), //
  8. user.HasFollowers(), // UserHasFollowers()
  9. ). //
  10. SetName("foo"). // Set field name.
  11. Save(ctx) // exec and return.

Query edge-predicates.

  1. n, err := client.User. // UserClient.
  2. Update(). // Pet update builder.
  3. Where( //
  4. user.HasFriendsWith( // UserHasFriendsWith (
  5. user.Or( // age = 20
  6. user.Age(20), // OR
  7. user.Age(30), // age = 30
  8. ) // )
  9. ), //
  10. ). //
  11. SetName("a8m"). // Set field name.
  12. Save(ctx) // exec and return.

查询

Query The Graph. 查询有粉丝的用户。

  1. users, err := client.User. // UserClient.
  2. Query(). // User query builder.
  3. Where(user.HasFollowers()). // filter only users with followers.
  4. All(ctx) // query and return.

获取某个用户的粉丝列表;从图中的某个节点开始图遍历。

  1. users, err := a8m.
  2. QueryFollowers().
  3. All(ctx)

获取某个用户的所有粉丝的所有宠物。

  1. users, err := a8m.
  2. QueryFollowers().
  3. QueryPets().
  4. All(ctx)

获取所有宠物的名字。

  1. names, err := client.Pet.
  2. Query().
  3. Select(pet.FieldName).
  4. Strings(ctx)

获取所有宠物的名字和年龄。

  1. var v []struct {
  2. Age int `json:"age"`
  3. Name string `json:"name"`
  4. }
  5. err := client.Pet.
  6. Query().
  7. Select(pet.FieldAge, pet.FieldName).
  8. Scan(ctx, &v)
  9. if err != nil {
  10. log.Fatal(err)
  11. }

你可以在 遍历 找到更多遍历的高级用法。

删除

删除一个实体。

  1. err := client.User.
  2. DeleteOne(a8m).
  3. Exec(ctx)

Delete by ID.

  1. err := client.User.
  2. DeleteOneID(id).
  3. Exec(ctx)

删除多个

根据条件过滤删除多个实体。

  1. err := client.File.
  2. Delete().
  3. Where(file.UpdatedAtLT(date))
  4. Exec(ctx)