ent 基本使用十二 字段

字段或者屬性,在schema中是定點的屬性,好比user 包含4個字段age,name,username,created_at
圖表展現以下:
git

 

 

 


代碼描述github

 
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

字段類型

當前支持的類型sql

  • 全部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 以及數字json

  • 簡單例子
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].
 
 

字符串類型ui

MinLen(i)
MaxLen(i)
Match(regexp.Regexp)

可選類型

經過Optional方法atom

// 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(),
    }
}

生成的實體url

// 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 的時候沒有setterspa

// 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/

相關文章
相關標籤/搜索