Day16 ent (一) | 青训营笔记
这是我参与「第五届青训营」伴学笔记创作活动的第 16 天
安装
安裝代碼生成工具
go install entgo.io/ent/cmd/ent@latest
Schema
新建數據實體
使用如下命令新建数据实体
ent init Xxx
Xxx为数据表对应的结构体名
之後會生成代碼在根目錄的ent
文件夾裏
例如
package schema
import "entgo.io/ent"
// User holds the schema definition for the User entity.
type User struct {
ent.Schema
}
// 用户实体的注解
func (User) Annotations() []schema.Annotation {
return []schema.Annotation{
entsql.Annotation{Table: "t_user"},
}
}
// Fields of the User.
func (User) Fields() []ent.Field {
return nil
}
// Edges of the User.
func (User) Edges() []ent.Edge {
return nil
}
这其中让表对应的结构体继承ent.Schema
就可以将这个结构体定义为Schema结构体
Field
定义Schema结构体之后就可以定義實體的字段
// Fields of the User.
func (User) Fields() []ent.Field {
return []ent.Field{
field.Int("id").StructTag(`json:oid,omitempty`),
field.String("username").Optional(),
field.String("password").Optional(),
}
}
实现Schema结构体的Fields
方法,该方法返回一个field切片,可以定义表字段的字段名,类型和是否可选等
目前框架支持以下数据类型:
- Go中所有数值类型。 如
int
,uint8
,float64
等 bool 布尔型
string 字符串
time.Time 时间类型
UUID
[]byte
(仅限SQL)。JSON
(仅限SQL)。Enum
(仅限SQL)。其它类型
(仅限SQL)
定义id字段可以用三種方式
// Fields of the Group.
func (Group) Fields() []ent.Field {
return []ent.Field{
field.Int("id").
StructTag(`json:"oid,omitempty"`),
}
}
// Fields of the Blob.
func (Blob) Fields() []ent.Field {
return []ent.Field{
field.UUID("id", uuid.UUID{}).
Default(uuid.New).
StorageKey("oid"),
}
}
// Fields of the Pet.
func (Pet) Fields() []ent.Field {
return []ent.Field{
field.String("id").
MaxLen(25).
NotEmpty().
Unique().
Immutable(),
}
}
如果想要配置 id
字段在所有表中唯一,可以在运行 schema 迁移时使用 WithGlobalUniqueID 选项实现。
定義好所有實體之後可以使用命令生成orm對應代碼
go generate ./ent
之後就可以鏈接數據庫了
package main
import (
"context"
"log"
"entdemo/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.Fatalf("failed opening connection to mysql: %v", err)
}
defer client.Close()
// Run the auto migration tool.
if err := client.Schema.Create(context.Background()); err != nil {
log.Fatalf("failed creating schema resources: %v", err)
}
}
測試代碼:
package main
import (
"log"
"entdemo/ent"
"entdemo/ent/user"
)
func QueryUser(ctx context.Context, client *ent.Client) (*ent.User, error) {
u, err := client.User.
Query().
Where(user.Name("a8m")).
// `Only` fails if no user found,
// or more than 1 user returned.
Only(ctx)
if err != nil {
return nil, fmt.Errorf("failed querying user: %w", err)
}
log.Println("user returned: ", u)
return u, nil
}
Edge
edge即数据表之间的关系
现在用命令生成三个表结构体
go run -mod=mod entgo.io/ent/cmd/ent new User Car Group
其中User与Car之间为一对多关系,而Group和User之间为多对多关系
那么定义User时可以实现Edges
方法
Edges
方法返回User所有的关系
然后Car对User具有的多对一从属关系冠可以如下定义
而User和Group之间的关系可以用如下的定义
本文作者:七つ一旋桜
本文链接:https://www.cnblogs.com/poifa/p/17716909.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步