GORM V2 模型定义、约定、标签

简介: GORM V2 模型定义、约定、标签

01

概念


使用 GORM 操作数据库,需要了解 GORM 的约定和字段标签提供的约束。尽量遵循 GORM 已有的约定,但是如果约定不符合需求,也可以自定义配置,从而改变已有约定,达到满足需求的目的。


02

模型定义


与使用 Go 标准库 sql 包操作数据库表相同,使用 GORM 操作数据库,也需要先声明模型,模型一般是基于 Go 语言的基础数据类型、实现了 Scanner 和 Valuer 接口的自定义类型,以及它们的指针或别名。


示例代码:

type User struct {
  ID           uint
  Name         string
  Email        *string
  Age          uint8
  Birthday     *time.Time
  MemberNumber sql.NullString
  ActivedAt    sql.NullTime
  CreatedAt    time.Time
  UpdatedAt    time.Time
}


03

约定


GORM 已有约定

默认情况下,GORM 约定使用 ID 作为主键,使用结构体名的复数作为表名,字段名作为列名,使用 CreatedAt、UpdatedAt、DeletedAt时间追踪。如果约定与需求不符,可以自定义配置。


gorm.Model

GORM 定义了一个 gorm.Model 结构体,字段包括 ID、CreatedAt、UpdatedAt、DeletedAt,我们可以将它嵌入到我们自定义的结构体中,详情见 04 章节。


示例代码:

// gorm.Model 的定义
type Model struct {
  ID        uint           `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
}


04

嵌入结构体


对于匿名字段,GORM 会将其字段包含在父结构体中。

type User struct {
  gorm.Model
  Name         string
  Email        *string
  Age          uint8
  Birthday     *time.Time
  MemberNumber sql.NullString
}

对于正常的结构体字段,你也可以通过标签 embedded 将其嵌入。

type Author struct {
    Name  string
    Email string
}
type Blog struct {
  ID      int
  Author  Author `gorm:"embedded"`
  Upvotes int32
}
// 等效于
type Blog struct {
  ID    int64
    Name  string
    Email string
  Upvotes  int32
}


并且,您可以使用标签 embeddedPrefix 来为 db 中的字段名添加前缀。

type Blog struct {
  ID      int
  Author  Author `gorm:"embedded;embeddedPrefix:author_"`
  Upvotes int32
}
// 等效于
type Blog struct {
  ID          int64
    AuthorName  string
    AuthorEmail string
  Upvotes     int32
}


05

标签


字段级别权限控制

在 GO 语言中,根据名称的首字母大小写来定义是否可被导出,GORM 使用可导出的字段进行 CRUD 时拥有全部权限,另外,GORM 可以使用标签控制字段级别的权限,可以让一个字段的权限是只读、只写、只创建、只更新和忽略该字段。


示例代码:

type User struct {
  Name string `gorm:"<-:create"` // 允许读和创建
  Name string `gorm:"<-:update"` // 允许读和更新
  Name string `gorm:"<-"`        // 允许读和写(创建和更新)
  Name string `gorm:"<-:false"`  // 允许读,禁止写
  Name string `gorm:"->"`        // 只读(除非有自定义配置,否则禁止写)
  Name string `gorm:"->;<-:create"` // 允许读和写
  Name string `gorm:"->:false;<-:create"` // 仅创建(禁止从 db 读)
  Name string `gorm:"-"`  // 读写操作均会忽略该字段
}


创建/更新时间追踪(纳秒、毫秒、秒、Time)

GORM 约定使用 CreatedAt、UpdatedAt 追踪创建/更新时间。如果您定义了他们,GORM 在创建/更新时会自动填充当前时间至这些字段,要使用不同名称的字段,您可以配置 autoCreateTim、autoUpdateTim 标签。


当然,你可以按照自己的需求自定义约定项。比如时间追踪默认是将为零值的创建时间CreatedAt 字段以当前时间填充,以当前时间戳秒数填充 UpdatedAt 字段,如果您想要保存 UNIX(毫/纳)秒时间戳,而不是 time,您只需简单地将 time.Time 修改为 int 即可,默认时间戳是 Unix 秒,你还可以使用标签将时间戳的单位改为纳秒或毫秒。


示例代码:

type User struct {
  CreatedAt time.Time // 在创建时,如果该字段值为零值,则使用当前时间填充
  UpdatedAt int       // 在创建时该字段值为零值或者在更新时,使用当前时间戳秒数填充
  Updated   int64 `gorm:"autoUpdateTime:nano"` // 使用时间戳填纳秒数充更新时间
  Updated   int64 `gorm:"autoUpdateTime:milli"` // 使用时间戳毫秒数填充更新时间
  Created   int64 `gorm:"autoCreateTime"`      // 使用时间戳秒数填充创建时间
}


字段标签

标签是模型定义时的可选项,GORM 的标签不区分大小写,推荐使用驼峰式命名。我们会在后续章节中,陆续使用到 GORM 提供的字段标签。


查阅 GORM 字段标签:

https://gorm.io/zh_CN/docs/models.html#%E5%AD%97%E6%AE%B5%E6%A0%87%E7%AD%BE





目录
相关文章
|
6月前
|
Go 数据库
GORM模型与约定
GORM模型与约定
105 0
|
6月前
|
Go 数据库
gorm模型创建以及关键标签
gorm模型创建以及关键标签
109 0
|
12月前
|
自然语言处理
如何定义标签词映射
如何定义标签词映射
|
3月前
|
XML JSON 计算机视觉
LangChain 构建问题之智能代理类型中的“预期模型类型”的定义如何解决
LangChain 构建问题之智能代理类型中的“预期模型类型”的定义如何解决
29 0
|
6月前
|
编译器 C#
C#.Net筑基-类型系统②常见类型 --record是什么类型?
`record`在C#中是一种创建简单、只读数据结构的方式,常用于轻量级数据传输。它本质上是类(默认)或结构体的快捷形式,包含自动生成的属性、`Equals`、`ToString`、解构赋值等方法。记录类型可以继承其他record或接口,但不继承普通类。支持使用`with`语句创建副本。例如,`public record User(string Name, int Age)`会被编译为包含属性、相等比较和`ToString()`等方法的类。记录类型提供了解构赋值和自定义实现,如密封的`sealed`记录,防止子类重写。
|
6月前
|
数据库 Python
定义模型
定义模型。
45 1
|
6月前
|
存储 自然语言处理
平台设计-代码字段与标签
在平台里描述对象的属性可以使用代码和标签
|
6月前
|
数据库 索引
gorm 多态以及关联标签
gorm 多态以及关联标签
58 0
|
11月前
|
前端开发 小程序 PHP
laravel5.8(四)引入自定义常量文件及公共函数文件
开发过程中,我们一般会用到一些不会改变,或者改变不是很频繁的值,这样的值我们一般将他们定义成常量。 比如网站根目录,或者分页数,或者域名等等。 那我们如何在laravel5.8中引入自定义的常量文件及公共的函数文件呢。 大概有两种方式: 1:框架目录下引入(不推荐) 在框架目录vendor下新建常量文件const.php,以及公共函数文件function.php 在autoload.php文件中引入。 这种方法是可以的,但是不推荐,框架目录下最好都是框架自己的那些文件,正常来说,框架的文件我们在开发过程中,git是不会进行托管的。 2:在app目录下引入 在bootstrap目录下新建常量文件
68 0
C结构中包含自己的嵌套定义
C结构中包含自己的嵌套定义
67 0
下一篇
无影云桌面