声明模型
模型是标准的 Golang 结构体。基本的 Go 类型、指针或它们的别名,以及自定义类型(实现了 Scanner 和 Valuer 接口)都可以作为模型的字段。
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 User struct {
gorm.Model
Name string
}
// 等同于
type User struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
Name string
}
字段级权限控制
可导出的字段在使用 GORM 进行 CRUD 时会被赋予所有权限。此外,GORM 允许你通过标签控制字段级别的权限(只读、只写、创建时忽略、更新时忽略等)。
| 标签名 | 描述 |
|---|---|
<- | 设置字段的写入权限,<-:create 仅创建,<-:update 仅更新,<-:false 禁止写入,<- 创建和更新 |
-> | 设置字段的读取权限,->:false 禁止读取 |
- | 忽略该字段,不进行读写操作 |
type User struct {
Name string `gorm:"<-:create"` // 允许读取和创建,但不允许更新
Name2 string `gorm:"<-:update"` // 允许读取和更新,但不允许创建
Name3 string `gorm:"<-"` // 允许读取、创建和更新 (默认)
Name4 string `gorm:"<-:false"` // 允许读取,禁止创建和更新
Name5 string `gorm:"->"` // 允许读取,禁止创建和更新 (同上)
Name6 string `gorm:"->:false"` // 禁止读取,允许创建和更新
Name7 string `gorm:"-"` // 读写时均忽略该字段
}
创建/更新时间追踪
GORM 使用 CreatedAt 和 UpdatedAt 来自动追踪创建和更新时间。如果模型包含这些字段,GORM 会在创建或更新时自动填充当前时间。
嵌入结构体
对于匿名字段,GORM 会将其字段包含在父结构体中。
type Author struct {
Name string
Email string
}
type Blog struct {
ID int
Author Author `gorm:"embedded"`
Upvotes int32
}
// 对应数据库表结构为 blog(id, name, email, upvotes)
你可以使用 embeddedPrefix 标签为嵌入字段的数据库列名添加前缀:
type Blog struct {
ID int
Author Author `gorm:"embedded;embeddedPrefix:author_"`
Upvotes int32
}
// 对应数据库表结构为 blog(id, author_name, author_email, upvotes)
字段标签 (Tags)
Tags 是声明模型时最重要的部分,用于控制列名、类型、索引等。
| 标签名 | 描述 |
|---|---|
| column | 指定数据库列名 |
| type | 指定数据库数据类型 (如 varchar(100)) |
| serializer | 指定序列化器 (如 json, gob, unixtime) |
| size | 指定列大小/长度 (如 256) |
| primaryKey | 指定为主键 |
| unique | 指定为唯一索引 |
| default | 指定默认值 |
| precision | 指定精度 |
| not null | 指定列不为空 |
| autoIncrement | 指定是否自增 |
| index | 创建索引 |
| uniqueIndex | 创建唯一索引 |
| check | 创建 check 约束 |
| comment | 添加列注释 |
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"column:user_name;type:varchar(100);not null"`
Age int `gorm:"check:age > 18"`
}