ORM
ORM(Object Relational Mapping,对象关系映射),作用是在关系型数据库和对象之间作一个映射。
1 | 数据表 <--> 类 |
GROM入门
详细内容查看GORM文档
连接数据库
1 | package main |
Grom.Model
为了方便模型定义,GORM内置了一个grom.Model
结构体,其包括字段 ID
、CreatedAt
、UpdatedAt
、DeletedAt
:
1 | // gorm.Model 的定义 |
可以将它嵌入到自己定义的结构体中,以包含这几个字段:
1 | // 定义模型 |
字段标签
声明 model 时,tag 是可选的,GORM 支持以下 tag:
标签名 | 说明 |
---|---|
column | 指定 db 列名 |
type | 列数据类型,推荐使用兼容性好的通用类型,例如:所有数据库都支持 bool、int、uint、float、string、time、bytes 并且可以和其他标签一起使用,例如:not null 、size , autoIncrement … 像 varbinary(8) 这样指定数据库数据类型也是支持的。在使用指定数据库数据类型时,它需要是完整的数据库数据类型,如:MEDIUMINT UNSIGNED not NULL AUTO_INCREMENT |
size | 指定列大小,例如:size:256 |
primaryKey | 指定列为主键 |
unique | 指定列为唯一 |
default | 指定列的默认值 |
precision | 指定列的精度 |
scale | 指定列大小 |
not null | 指定列为 NOT NULL |
autoIncrement | 指定列为自动增长 |
autoIncrementIncrement | 自动步长,控制连续记录之间的间隔 |
embedded | 嵌套字段 |
embeddedPrefix | 嵌入字段的列名前缀 |
autoCreateTime | 创建时追踪当前时间,对于 int 字段,它会追踪秒级时间戳,您可以使用 nano /milli 来追踪纳秒、毫秒时间戳,例如:autoCreateTime:nano |
autoUpdateTime | 创建/更新时追踪当前时间,对于 int 字段,它会追踪秒级时间戳,您可以使用 nano /milli 来追踪纳秒、毫秒时间戳,例如:autoUpdateTime:milli |
index | 根据参数创建索引,多个字段使用相同的名称则创建复合索引,查看 索引 获取详情 |
uniqueIndex | 与 index 相同,但创建的是唯一索引 |
check | 创建检查约束,例如 check:age > 13 ,查看 约束 获取详情 |
<- | 设置字段写入的权限, <-:create 只创建、<-:update 只更新、<-:false 无写入权限、<- 创建和更新权限 |
-> | 设置字段读的权限,->:false 无读权限 |
- | 忽略该字段,- 无读写权限 |
comment | 迁移时为字段添加注释 |
关联标签:
标签 | 描述 |
---|---|
foreignKey | 指定当前模型的列作为连接表的外键 |
references | 指定引用表的列名,其将被映射为连接表外键 |
polymorphic | 指定多态类型,比如模型名 |
polymorphicValue | 指定多态值、默认表名 |
many2many | 指定连接表表名 |
joinForeignKey | 指定连接表的外键列名,其将被映射到当前表 |
joinReferences | 指定连接表的外键列名,其将被映射到引用表 |
constraint | 关系约束,例如:OnUpdate 、OnDelete |
主键、表名、列名的约定
主键
GORM默认会使用名为ID的字段作为表的主键:
1 | type User struct { |
表名
表名默认是结构体的复数:
1 | type User struct {} // 默认表名是 `users` |
可以通过Table()
指定表名
1 | // 使用User结构体创建名为`deleted_users`的表 |
列名
列名默认由字段名称进行下划线分割来生成:
1 | type User struct { |
可以使用结构体tag指定列名:
1 | type Animal struct { |
时间戳跟踪
如果模型有
CreatedAt
字段,该字段的值将会是初次创建记录的时间如果模型有
UpdatedAt
字段,该字段的值将会是每次更新记录的时间如果模型有
DeletedAt
字段,调用Delete
删除该记录时,将会设置DeletedAt
字段为当前时间,而不是直接将记录从数据库中删除