Skip to content

Latest commit

 

History

History
245 lines (189 loc) · 4.4 KB

crud.md

File metadata and controls

245 lines (189 loc) · 4.4 KB
id title
crud
CRUD API

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

  • 用于和图(数据库)交互的 ClientTx.
  • 每个模式的增查改删(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)