modal
例1
go
type InvitationCode struct {
BaseModel
Code string `gorm:"column:code;size:64;not null;uniqueIndex"`
// 类型:长期有效、指定时间、一次性
Type types.InvitationType `gorm:"column:type;type:varchar(20);not null;default:'one_time'"`
Status types.InvitationStatus `gorm:"column:status;type:varchar(20);not null;default:'active'"`
ExpiredAt time.Time `gorm:"column:expired_at;type:timestamp;default:null"`
UserGroupID uint `gorm:"column:user_group_id;not null;index"`
UserGroup UserGroup `gorm:"foreignKey:UserGroupID;references:ID"`
UsedByID *uint `gorm:"column:used_by_id;index"`
UsedBy User `gorm:"foreignKey:UsedByID;references:ID"`
}go
type UserGroup struct {
BaseModel
Name string `gorm:"column:name;size:64;not null;uniqueIndex"`
Description string `gorm:"column:description;size:255"`
Apps []App `gorm:"many2many:user_group_link_apps;joinForeignKey:UserGroupID;JoinReferences:AppID"`
}go
type User struct {
BaseModel
Account string `gorm:"column:account;size:64;not null;uniqueIndex"`
Email string `gorm:"column:email;size:255;not null;uniqueIndex"`
Phone string `gorm:"column:phone;size:255;not null;uniqueIndex"`
Nickname string `gorm:"column:nickname;size:255;not null"`
}go
type InvitationType string
const (
InvitationPermanent InvitationType = "permanent" // 长期有效
InvitationTimeLimited InvitationType = "time_limited" // 指定时间
InvitationOneTime InvitationType = "one_time" // 一次性
)
type InvitationStatus string
const (
InvitationActive InvitationStatus = "active"
InvitationUsed InvitationStatus = "used"
InvitationExpired InvitationStatus = "expired"
InvitationRevoked InvitationStatus = "revoked"
)UserGroupID 使用 uint,因为是确定的,必须有。
UsedByID 使用 *uint,因为 UserByID 可能为空。
pg的jsonb
go
package model
import (
"gorm.io/gorm"
)
// 嵌套结构体
type ExtraInfo struct {
Address string `json:"address"`
Phone string `json:"phone"`
Age int `json:"age"`
}
// 主表
type User struct {
gorm.Model
Name string `gorm:"size:32"`
// 👇 关键:JSONB 字段
Extra ExtraInfo `gorm:"type:jsonb;default:'{}'"` // JSON 对象
Hobbies []string `gorm:"type:jsonb;default:'[]'"` // JSON 数组
}插入
go
user := User{
Name: "张三",
Extra: ExtraInfo{
Address: "北京",
Phone: "13800138000",
},
Hobbies: []string{"篮球", "游泳"},
}
db.Create(&user)更新
go
// 会覆盖整个 Extra
db.Model(&User{}).Where("id=?", 1).
Updates(User{
Extra: ExtraInfo{Address: "上海"},
})查询
go
// 查询 extra ->> address = '北京' 的用户
db.Where("extra ->> 'address' = ?", "北京").Find(&users)go
// 查询 hobbies 数组包含 "篮球"
db.Where("hobbies @> ?", `"[\"篮球\"]"`).Find(&users)