Skip to main content

声明模型

模型是标准的 Golang 结构体。基本的 Go 类型、指针或它们的别名,以及自定义类型(实现了 ScannerValuer 接口)都可以作为模型的字段。

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 使用 CreatedAtUpdatedAt 来自动追踪创建和更新时间。如果模型包含这些字段,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"`
}