gorm声明模型
本文多转自gorm官方文档
模型定义
模型是标准的struct,由go的基本数据类型,实现了Scanner和Valuer接口的自定义类型及其指针或别名的组成
例如:
type User struct {
ID uint
Name string
Email *string
Age uint8
Birthday *time.Time
MemberNumber sql.NullString
ActivatedAt sql.NullTime
CreatedAt time.Time
UpdatedAt time.Time
}
个人理解模型是数据库与对象的一个映射,结构体名与表名对应,字段名与列名对应,各字段值与各列值对应,通过此模型来实现orm方法。
约定
GORM 倾向于约定,而不是配置。默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间
遵循 GORM 已有的约定,可以减少您的配置和代码量。如果约定不符合您的需求,GORM 允许您自定义配置它们
个人理解:蛇形复数为在名法中,各个单词之间通过下划线“_”连接,比如test_tb1。若末尾不是数字结尾,模型会自动添加s。在此约定下,结构名若为TestTb2这种大驼峰命名法时,创建的表名则为test_tb2 ,同样的字段名为UserName时创建的列名则为user_name。因此建议模型命名应当符合驼峰命名法。
gorm.Model
GORM 定义一个 gorm.Model 结构体,其包括字段 ID、CreatedAt、UpdatedAt、DeletedAt
// gorm.Model 的定义
type Model struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
利用时只需要嵌套在自己声明的模型里即可。
列如
type TestTb2 struct {
gorm.Model
Id int
Username string
Password string
}
含有Model结构体的模型在经行删除操作时,是经行软删除,删除之后数据依旧存在于数据库,但不会被查找出来。含有Model结构体的模型经行查找时会判断DeletedAt是否为null。
高级选项
字段级权限控制
可导出的字段在使用 GORM 进行 CRUD 时拥有全部的权限,此外,GORM 允许您用标签控制字段级别的权限。这样您就可以让一个字段的权限是只读、只写、只创建、只更新或者被忽略
注意: 使用 GORM Migrator 创建表时,不会创建被忽略的字段
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:"-"` // 通过struct读写会忽略该字段
Name string `gorm:"-:all"` // 写入、读取和迁移结构时,忽略这个字段。
Name string `gorm:"-:migration"` // 迁移时忽略这个字段
}
字段标签
声明 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 |
size | 指定列大小 |
primaryKey | 指定为主键 |
unique | 指定列为唯一 |
default | 指定列的默认值 |
precision | 指定列的精度 |
scale | 指定列大小 |
not null | 指定列不为空 |
autoIncrement | 指定列为自增长 |
embedded | 嵌套字段 |
embeddedPrefix | 嵌套字段的列名前缀 |
index | 使用选项创建索引,对多个字段使用相同的名称,创建复合索引 |
uniqueIndex | 与index相同,但创建的是唯一索引 |
check | 创建约束条件 |
<- | 设置字段写入的权限,<-:create只创建,<-:update只更新,<-:false无写权限,<-创建与更新的权限 |
-> | 设置字段读的权限,->:false无读权限 |
- | 忽略该字段,-无读写权限 |
comment | 迁移时为字段添加注解 |
还要一些关联标签,在关联学习时写出