• ent 基本使用十二 字段


    字段或者属性,在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(),
        }
    }
     
     

    存储key

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

    // Fields of the user.
    func (User) Fields() []ent.Field {
        return []ent.Field{
            field.String("name").
                StorageKey(`old_name"`),
        }
    }
     
     

    strcut tags

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

    // Fields of the user.
    func (User) Fields() []ent.Field {
        return []ent.Field{
            field.String("name").
                StructTag(`gqlgen:"gql_name"`),
        }
    }

    struct 字段

    默认生成的实体字段配置信息都是在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/

  • 相关阅读:
    Python3练习题系列(02)
    英语口语学习笔记(09)
    Python3练习题系列(01)
    (转)chm格式的电子书打开是空白的解决办法
    SQL Server 创建链接服务器
    (转)js正则表达式之中文验证
    (转)SQL语句中的N'xxxx'是什么意思
    (转)C#之玩转反射
    (转)抽象工厂学习笔记
    (转)单例模式(Singleton)
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/11675973.html
Copyright © 2020-2023  润新知