ent 基本使用十二 字段
阅读原文时间:2023年07月12日阅读:1

字段或者属性,在schema中是定点的属性,比如user 包含4个字段age,name,username,created_at
图表展示如下:

代码描述

package schema

import (

"time"

"github.com/facebookincubator/ent"

"github.com/facebookincubator/ent/schema/field"

)

// User schema.

type User struct {

ent.Schema

}

// Fields of the user.

func (User) Fields() []ent.Field {

return \[\]ent.Field{

    field.Int("age"),

    field.String("name"),

    field.String("username").

        Unique(),

    field.Time("created\_at").

        Default(time.Now),

}

}

说明:
默认字段都是必须选项,但是我们可以通过 optional 方法调整

当前支持的类型

  • 所有golang 数字类型 int unit8 float64
  • bool
  • string
  • time.Time
  • []byte(需要sql 方言的支持)
  • JSON (需要sql 方言支持)当前是体验
  • Enum (需要sql 方言支持)
    参考demo

package schema

import (

"time"

"github.com/facebookincubator/ent"

"github.com/facebookincubator/ent/schema/field"

)

// User schema.

type User struct {

ent.Schema

}

// Fields of the user.

func (User) Fields() []ent.Field {

return \[\]ent.Field{

    field.Int("age").

        Positive(),

    field.Float("rank").

        Optional(),

    field.Bool("active").

        Default(false),

    field.String("name").

        Unique(),

    field.Time("created\_at").

        Default(time.Now),

    field.JSON("url", &url.URL{}).

        Optional(),

    field.JSON("strings", \[\]string{}).

        Optional(),

    field.Enum("state").

        Values("on", "off").

        Optional(),

}

}

非唯一字段支持使用模式值Default UpdateDefaul 方法

// Fields of the User.

func (User) Fields() []ent.Field {

return \[\]ent.Field{

    field.Time("created\_at").

        Default(time.Now),

    field.Time("updated\_at").

        Default(time.Now).

        UpdateDefault(time.Now),

}

}

对于字段我们可以添加校验器功能,支持校验器的字段为string 以及数字

  • 简单例子

package schema

import (

"errors"

"regexp"

"strings"

"time"

"github.com/facebookincubator/ent"

"github.com/facebookincubator/ent/schema/field"

)

// Group schema.

type Group struct {

ent.Schema

}

// Fields of the group.

func (Group) Fields() []ent.Field {

return \[\]ent.Field{

    field.String("name").

        Match(regexp.MustCompile("\[a-zA-Z\_\]+$")).

        Validate(func(s string) error {

            if strings.ToLower(s) == s {

                return errors.New("group name must begin with uppercase")

            }

            return nil

        }),

}

}

  • 内置校验器
    数字类型

Positive()

Negative()

Min(i)

Max(i)

Range(i, j) 范围 [i, j].

字符串类型

MinLen(i)

MaxLen(i)

Match(regexp.Regexp)

通过Optional方法

// Fields of the user.

func (User) Fields() []ent.Field {

return \[\]ent.Field{

    field.String("required\_name"),

    field.String("optional\_name").

        Optional(),

}

}

  • 说明
    有时候我们需要区分零值以及 nil,比如o 或者NULL, nillable 选项就是一个很不错的选择,如果对于字段类型T已经配置了optional 那么添加
    nillable会生成*T ,如果数据库对于当前字段返回NULL,那么次字段会为nil,否则会是包含实际数据的指针
  • 实例代码

// Fields of the user.

func (User) Fields() []ent.Field {

return \[\]ent.Field{

    field.String("required\_name"),

    field.String("optional\_name").

        Optional(),

    field.String("nillable\_name").

        Optional().

        Nillable(),

}

}

生成的实体

// ent/user.go

package ent

// User entity.

type User struct {

RequiredName string \`json:"required\_name,omitempty"\`

OptionalName string \`json:"optional\_name,omitempty"\`

NillableName \*string \`json:"nillable\_name,omitempty"\`

}

主要是字段只有create ,在update 的时候没有setter

// Fields of the user.

func (User) Fields() []ent.Field {

return \[\]ent.Field{

    field.String("name"),

    field.Time("created\_at").

        Default(time.Now),

        Immutable(),

}

}

字段可以定义为唯一的,注意不能包含默认值

// Fields of the user.

func (User) Fields() []ent.Field {

return \[\]ent.Field{

    field.String("name"),

    field.String("nickname").

        Unique(),

}

}

主要定义在sql 或者Gremlin 存储的名称

// Fields of the user.

func (User) Fields() []ent.Field {

return \[\]ent.Field{

    field.String("name").

        StorageKey(\`old\_name"\`),

}

}

可以给字段添加自定义的struct tag,如果没有提供 ,默认是json
比如如下,添加Gremlin 的支持

// Fields of the user.

func (User) Fields() []ent.Field {

return \[\]ent.Field{

    field.String("name").

        StructTag(\`gqlgen:"gql\_name"\`),

}

}

默认生成的实体字段配置信息都是在schema.Fields 中,如下:

// User schema.

type User struct {

ent.Schema

}

// Fields of the user.

func (User) Fields() []ent.Field {

return \[\]ent.Field{

    field.Int("age").

        Optional().

        Nillable(),

    field.String("name").

        StructTag(\`gqlgen:"gql\_name"\`),

}

}

生成的实体为

// User is the model entity for the User schema.

type User struct {

// Age holds the value of the "age" field.

Age \*int \`json:"age,omitempty"\`

// Name holds the value of the "name" field.

Name string \`json:"name,omitempty" gqlgen:"gql\_name"\`

}

为了添加额外的字段,但是不存储在数据库中,我们可以参考如下做法:

// User schema.

type User struct {

ent.Schema

// Additional struct-only fields.

Tenant string

Logger \*log.Logger

}

生成的实体

// User is the model entity for the User schema.

type User struct {

// Age holds the value of the "age" field.

Age \*int \`json:"age,omitempty"\`

// Name holds the value of the "name" field.

Name string \`json:"name,omitempty" gqlgen:"gql\_name"\` 

// additional struct fields defined in the schema.

Tenant string

Logger \*log.Logger

}

主要是对于一些敏感字段的忽略输出,比如用户密码

// User schema.

type User struct {

ent.Schema

}

// Fields of the user.

func (User) Fields() []ent.Field {

return \[\]ent.Field{

    field.String("password").

        Sensitive(),

}

}

https://entgo.io/docs/schema-fields/

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章