• Welcome to Journal web site.

我是 PHP 程序员

- 开发无止境 -

Next
Prev

Golang 之 gorm 标签介绍

Data: 2019-01-02 11:48:36Form: JournalClick: 12

结构体标签

标签定义

Tag是结构体在编译阶段关联到成员的元信息字符串,在运行的时候通过反射的机制读取出来。

结构体标签由一个或多个键值对组成。键与值使用冒号分隔,值用双引号括起来。键值对之间使用一个空格分隔的,如下

 key会指定反射的解析方式,ps: json(JSON标签) orm(Beego标签)、gorm(GORM标签)、bson(MongoDB标签)、form(表单标签)、binding(表单验证标签) search(搜索标签)

包介绍 encoding/json

Gorm 标签

JSON 数组可以用于编码Go语言的数组slice;由于JSON对象是一个字符串到值的映射,写成一系列的name:value对形式,因此JSON的对象类型可以用于编码Go语言的map结构体

将Go语言中结构体slice转为JSON的过程叫编组(marshaling),编组通过json.Marshal函数完成。在编码时,默认使用Go语言结构体的成员名字作为JSON的对象(通过reflect反射技术)。只有导出的结构体成员才会被编码。

json标签示例

标签选项 使用说明
- 字段不进行序列化 例:json:"-"
omitempy 类型零值或空值,序列化时忽略该字段 例:json:",omitempy" 字段名省略的话用结构体字段名
type 重新指定字段类型 例:json:"age,int"

gorm标签

模型是标准的 struct,由基本数据类型以及实现了 Scanner 和 Valuer 接口的自定义类型及其指针或别名组成。

gorm.Model 结构体,如图:

gorm为键名的标签遵循GORM的解析规则,GORM支持如下tag,tag名大小写不敏感

标签项 介绍
column 指定 db 列名
type 列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:not nullsizeautoIncrement… 像 varbinary(8) 这样指定数据库数据类型也是支持的。在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INCREMENT
size 指定列大小,ps:size:1024
primaryKey 主键
unique 指定为唯一
default 默认值
precision 精度
scale 列大小
not null NOT NULL
autoIncrement 自动增长,不可与primaryKeytype同时使用否则不生效
autoIncrementIncrement 自动步长,控制连续记录之间的间隔
embedded 嵌套字段
embeddedPrefix 嵌套字段前缀
autoCreateTime 创建时追踪当前时间,对于 int 字段,它会追踪秒级时间戳,可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoCreateTime:milli
autoUpdateTime 创建/更新时追踪当前时间,对于 int 字段,它会追踪秒级时间戳,可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoUpdateTime:milli
index 根据参数创建索引,多个字段使用相同的名称则创建复合索引,查看 索引 获取详情
uniqueIndex 与 index 相同,但创建的是唯一索引
check 创建检查约束,例如 check:age > 13,查看 约束 获取详情
comment 迁移时为字段添加注释
- 忽略该字段,- 无读写权限

关联标签(Association Tags)

标签 描述
foreignKey 指定当前模型的列作为连接表的外键
references 指定引用表的列名,其将被映射为连接表外键
polymorphic 指定多态类型,比如模型名
polymorphicValue 指定多态值、默认表名
many2many 指定连接表表名
joinForeignKey 指定连接表的外键列名,其将被映射到当前表
joinReferences 指定连接表的外键列名,其将被映射到引用表
constraint 关系约束,例如:OnUpdateOnDelete

注:GORM模型 官方文档

form标签

Gin中提供了模型绑定,将表单数据和模型进行绑定,方便参数校验和使用。

 通过 form:"email" 对表单email数据进行绑定。然后通过Bind()、ShouldBind()等方法获取参数值。 ps:

validate

Gin对于数据的校验使用的是 validator.v10 包,该包提供多种数据校验方法,通过validate:""标签来进行数据校验。

必需校验

标签项 介绍 示例
required 必须的 validate:"required"
omitempty 如果字段未设置,则忽略它 validate:"omitempty"

范围校验

范围验证: 切片、数组和map、字符串,验证其长度;数值,验证大小范围

标签项 介绍 示例
len 参数值等于给定值 validate:"len=1"等于1
ne 不等于 validate:"ne=1"
max 最大值 validate:"max=1"
min 最小值 validate:"min=1"
lte 小于等于 validate:"lte=1"
gte 大于等于 validate:"gte=1"
lt 小于 validate:"lt=1"
gt 大于 validate:"gt=1"
oneof 参数值只能是枚举值中的一个,值必须是数值或字符串,以空格分隔,如果字符串中有空格,将字符串用单引号包围 validate:"oneof=1 2 3 4"

注:文档地址

字符串校验

标签项 介绍 示例
contains 包含 validate:"contains=1"
excludes 不包含 validate:"excludes=1"
startswith 以xx开始 validate:"startswith=1"
endswith 以xx结束 validate:"endswith=1"

注:文档地址

字段校验

标签项 介绍
eqcsfield 跨不同结构体字段相等,比如struct1 field1 是否等于struct2 field2
necsfield 跨不同结构体字段不相等
eqfield 同一结构体字段相等验证,例如:输入两次密码
nefield 同一结构体字段不相等验证
gtefield 大于等于同一结构体字段
ltefield 小于等于同一结构体字段

其他校验

标签项 介绍 示例
ip 合法IP地址校验 validate:"ip"
email 合法邮箱校验 validate:"email"
url 合法的URL validate:"url"
uri 合法的URI validate:"uri"
uuid uuid校验 validate:"uuid"
datetime 合法时间格式值校验 validate:"datetime"
json JSON数据验证 validate:"json"
numeric 数值验证 validate:"numeric"
number 整数验证 validate:"number"
alpha uui字母字符串验证 validate:"alpha"
alphanum 字母数字字符串验证 validate:"alphanum"
ascii Ascii 字符验证 validate:"ascii"

注:文档地址

Name:
<提交>