批里批里 (゜-゜)つ🍺 干杯~|

七つ一旋桜

园龄:4年2个月粉丝:6关注:3

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中所有数值类型。 如 intuint8float64
  • 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方法 image.png Edges方法返回User所有的关系

然后Car对User具有的多对一从属关系冠可以如下定义 image.png

而User和Group之间的关系可以用如下的定义

image.png

image.png

本文作者:七つ一旋桜

本文链接:https://www.cnblogs.com/poifa/p/17716909.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   七つ一旋桜  阅读(49)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起