增查改删 API
如 代码生成 部分描述的那样,定义好模式后,运行 entc 可以生成以下内容
用于和图(数据库)交互的
Client和Tx.每个模式的增查改删(CRUD)构建器,查看 增查改删API 详情。
每个模式的实体 (Go struct).
包含用于和构建器交互的常量和条件查询方法。
为 SQL 提供的
migrate包. 查看 数据库迁移 详情。
创建一个客户端
MySQL
package main
import (
    "log"
    "<project>/ent"
    _ "github.com/go-sql-driver/mysql"
)
func main() {
    client, err := ent.Open("mysql", "<user>:<pass>@tcp(<host>:<port>)/<database>?parseTime=True")
    if err != nil {
        log.Fatal(err)
    }
    defer client.Close()
}SQLite
package main
import (
    "log"
    "<project>/ent"
    _ "github.com/mattn/go-sqlite3"
)
func main() {
    client, err := ent.Open("sqlite3", "file:ent?mode=memory&cache=shared&_fk=1")
    if err != nil {
        log.Fatal(err)
    }
    defer client.Close()
}Gremlin (AWS Neptune)
package main
import (
    "log"
    "<project>/ent"
)
func main() {
    client, err := ent.Open("gremlin", "http://localhost:8182")
    if err != nil {
        log.Fatal(err)
    }
}创建
创建一个实体。
Save 创建一个用户.
a8m, err := client.User.    // UserClient.
    Create().                // User create builder.
    SetName("a8m").            // Set field value.
    SetNillableAge(age).    // Avoid nil checks.
    AddGroups(g1, g2).        // Add many edges.
    SetSpouse(nati).        // Set unique edge.
    Save(ctx)                // Create and return.SaveX 创建一个用户;不同于 Save, SaveX 遇到错误时会引起 panics.
pedro := client.Pet.    // PetClient.
    Create().            // User create builder.
    SetName("pedro").    // Set field value.
    SetOwner(a8m).        // Set owner (unique edge).
    SaveX(ctx)            // Create and return.更新
更新一个数据库返回的实体。
a8m, err = a8m.Update().    // User update builder.
    RemoveGroup(g2).        // Remove specific edge.
    ClearCard().            // Clear unique edge.
    SetAge(30).                // Set field value
    Save(ctx)                // Save and return.根据 ID 更新
根据 ID 更新一个实体。
pedro, err := client.Pet.    // PetClient.
    UpdateOneID(id).        // Pet update builder.
    SetName("pedro").        // Set field name.
    SetOwnerID(owner).        // Set unique edge, using id.
    Save(ctx)                // Save and return.更新多个
根据条件过滤更新多个实体。
n, err := client.User.            // UserClient.
    Update().                    // Pet update builder.
    Where(                        //
        user.Or(                // (age >= 30 OR name = "bar") 
            user.AgeEQ(30),     //
            user.Name("bar"),    // AND
        ),                        //  
        user.HasFollowers(),    // UserHasFollowers()  
    ).                            //
    SetName("foo").                // Set field name.
    Save(ctx)                    // exec and return.Query edge-predicates.
n, err := client.User.            // UserClient.
    Update().                    // Pet update builder.
    Where(                        // 
        user.HasFriendsWith(    // UserHasFriendsWith (
            user.Or(            //   age = 20
                user.Age(20),    //      OR
                user.Age(30),    //   age = 30
            )                    // )
        ),                         //
    ).                            //
    SetName("a8m").                // Set field name.
    Save(ctx)                    // exec and return.查询
Query The Graph. 查询有粉丝的用户。
users, err := client.User.        // UserClient.
    Query().                    // User query builder.
    Where(user.HasFollowers()).    // filter only users with followers.
    All(ctx)                    // query and return.获取某个用户的粉丝列表;从图中的某个节点开始图遍历。
users, err := a8m.
    QueryFollowers().
    All(ctx)获取某个用户的所有粉丝的所有宠物。
users, err := a8m.
    QueryFollowers().
    QueryPets().
    All(ctx)获取所有宠物的名字。
names, err := client.Pet.
    Query().
    Select(pet.FieldName).
    Strings(ctx)获取所有宠物的名字和年龄。
var v []struct {
    Age  int    `json:"age"`
    Name string `json:"name"`
}
err := client.Pet.
    Query().
    Select(pet.FieldAge, pet.FieldName).
    Scan(ctx, &v)
if err != nil {
    log.Fatal(err)
}你可以在 遍历 找到更多遍历的高级用法。
删除
删除一个实体。
err := client.User.
    DeleteOne(a8m).
    Exec(ctx)Delete by ID.
err := client.User.
    DeleteOneID(id).
    Exec(ctx)删除多个
根据条件过滤删除多个实体。
err := client.File.
    Delete().
    Where(file.UpdatedAtLT(date))
    Exec(ctx)Last updated
Was this helpful?
