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字段为当前时间,而不是直接将记录从数据库中删除