GORM 标签使用全解析

GORM 作为 Go 语言中一个流行的 ORM(对象关系映射)库,极大地简化了数据库操作。而 GORM 中的标签(Tag)机制,则为我们提供了丰富的功能扩展手段。在这篇博客中,我将带你一探 GORM 标签的奥秘,并通过实例演示如何巧妙地运用它们。

一、 GORM 标签简介

GORM 的标签是一种特殊的属性,可以附加在模型的字段上。这些标签在 GORM 执行 CRUD 操作时起作用,它们可以用来定义字段的数据库映射、验证规则、业务逻辑等。通过合理地使用标签,我们可以减少大量的样板代码,使业务逻辑更加清晰。

二、 GORM 标签的分类

数据库相关标签

gorm:“column:name;primary_key;type:string”
这个标签指定了字段在数据库中对应的列名、是否为主键以及数据类型。

验证相关标签

gorm:“size:10;not_blank;”
这个标签指定了字段的长度限制和是否允许为空值。

业务逻辑标签

gorm:“before_save:do_something”
这个标签定义了在保存记录之前需要执行的业务逻辑。

三、 GORM 标签的使用场景

字段映射

当数据库的表结构与 Go 模型的字段名称不完全匹配时,可以使用 gorm:“column:name” 来指定映射关系。
示例:数据库中有一个名为 user_id 的字段,而 Go 模型中对应的字段名为 UserId。在这种情况下,我们可以在模型中这样定义:

type User struct {
    gorm.Model
    UserId int `gorm:"column:user_id"`
}

验证规则

使用 GORM 提供的验证标签,如 required, email, max:size 等,可以在模型层对输入数据进行验证。
示例:假设我们有一个 Registration 结构体,它代表了用户注册信息,其中 Email 和 Password 字段必须填写,且 Email 必须是有效的电子邮箱格式。我们可以这样定义模型:

type Registration struct {
    gorm.Model
    Email string `gorm:"size:100;validation:Email"`
    Password string `gorm:"size:30;validation:Required"`
}

业务逻辑

在某些业务场景中,我们可能需要在数据持久化到数据库之前或之后执行特定的业务逻辑。GORM 的生命周期钩子(如 BeforeSave 和 AfterCreate)正是为这些场景设计的。

字段标签

声明 model 时,tag 是可选的,GORM 支持以下 tag: tag 名大小写不敏感,但建议使用 camelCase 风格。

标签名说明
column指定 db 列名
type列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:not null、size, autoIncrement… 像 varbinary(8) 这样指定数据库数据类型也是支持的。在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INCREMENT
serializer指定将数据序列化或反序列化到数据库中的序列化器, 例如: serializer:json/gob/unixtime
size定义列数据类型的大小或长度,例如 size: 256
primaryKey将列定义为主键
unique将列定义为唯一键
default定义列的默认值
precision指定列的精度
scale指定列大小
not null指定列为 NOT NULL
autoIncrement指定列为自动增长
autoIncrementIncrement自动步长,控制连续记录之间的间隔
embedded嵌套字段
embeddedPrefix嵌入字段的列名前缀
autoCreateTime创建时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoCreateTime:nano
autoUpdateTime创建/更新时追踪当前时间,对于 int 字段,它会追踪时间戳秒数,您可以使用 nano/milli 来追踪纳秒、毫秒时间戳,例如:autoUpdateTime:milli
index根据参数创建索引,多个字段使用相同的名称则创建复合索引,查看 索引 获取详情
uniqueIndex与 index 相同,但创建的是唯一索引
check创建检查约束,例如 check:age > 13,查看 约束 获取详情
<-设置字段写入的权限, <-:create 只创建、<-:update 只更新、<-:false 无写入权限、<- 创建和更新权限
->设置字段读的权限,->:false 无读权限忽略该字段,- 表示无读写,-:migration 表示无迁移权限,-:all 表示无读写迁移权限
comment迁移时为字段添加注释
  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值