gorm的使用 | 青训营笔记

81 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

一、gorm的模型定义

由 Go 的基本数据类型、实现了 ScannerValuer 接口的自定义类型及其指针或别名组成

例如

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
}

约定

GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 (userName -> user_names, 加下划线加s)作为表名,字段名的 蛇形(userSex -> user_sex, 蛇形转换加下划线) 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间。

嵌入结构体

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

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
}

对于正常的结构体字段,可以通过标签 embedded 将其嵌入,例如:

type Author struct { Name string Email string } type Blog struct { ID int //这里如果不加入"embedded" gorm将不会把Author中的字段加入到Blog表中 Author Author gorm:"embedded" Upvotes int32 } // 等效于 type Blog struct { ID int64 Name string Email string Upvotes int32 }

如果不加"embedded",需要实现对该类型实现Scanner和Valuer接口,此时gorm会认为此字段是一个自定义的类型,将该字段名的蛇形作为表中的属性名,

如果没有实现这两个接口,则gorm会将该字段理解为数据库中的另一个model,此时即构成belong to/ has one关系, 需要在字段中添加外键和引用

字段标签

参考官网:gorm.io/zh_CN/docs/…

二、gorm中不同表之间的关联

belong to

belong to 这种模型的每一个实例都"属于"另一个模型的实例。

例如,每一个user都属于一个company,这时在user表中应该存在一个外键来引用company这个表的主键,这样即构成了每一个user都"属于"一个company,同时可以根据user中的外键来索引company

当在gorm中构建一个belong to关系时,要注意,必须先创建( AutoMigrate) 主表(company),再去 AutoMigrate子表, 同时gorm会默认将 外键的名字,使用拥有者(主表)的类型名称加上表的主键的字段名字,

例如,当每一个user都属于一个company时,user中的外键字段 = company(字段的类型名称) + Id(company 表的主键) = companyId,如果想指定user中的其他字段为外键字段的话, 需要添加"foreignKey"的tag