这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
1 ORM (Object Relational Mapping)
ORM的作用是在关系型数据库和对象之间作一个映射,可以让我们在操作数据库的时候,不需要再编写复杂的SQL语句。
GORM中结构体对应一个数据表、结构体的字段对应数据表的字段、结构体的一个实例对应数据表中的一条记录。
2 GORM的使用
以MySQL为例,安装gorm框架以及mysql的驱动:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
2.1 连接数据库
DSN (Data source name) 包含数据库连接的主机地址、端口号、用户名、密码、数据库名等信息,以及一些配置信息,如字符集、时区等。DSN信息的格式如下:
[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN]
连接一个MySQL数据库的方法如下:
import (
"gorm.io/gorm"
"gorm.io/driver/mysql"
)
func main() {
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}
在数据库连接时的优化方向可以(1)关闭默认事务(2)缓存预编译语句
db, err := gorm.Open(mysql.Open(dsn),
&gorm.Config{
SkipDefaultTransaction: true, // 关闭默认事务
PrepareStmt: true}, // 缓存预编译语句
)
2.2 增删查改
GORM的增删查改操作在官方文档中有详细的代码Demo,下面就总结一些关键点:
- 在查询操作中,如果使用
First方法,当查询不到时会返回ErrRecordNotFound,而使用Find方法时不会出现报错,因此尽量使用Find方法进行数据查询,通过逻辑代码判断是否查询成功; - 使用结构体进行更新操作时只会更新非零值,因此需要更新零值时可以使用Map或者Select选择,一般结构体用于兜底;
- GORM提供了DeleteAt字段帮助用户实现软删除(即保留删除的记录,在DeleteAt字段进行标记),使用方法如下:
type User struct { gorm.Model // 嵌入gorm.Model Name string } type User struct { Name string DeleteAt gorm.DeleteAt // 添加DeleteAt字段 }
2.3 事务 & Hook
GORM提供了Begin、Commit、Rollback方法用于事务:GORM官方文档 | 事务
Hook 是在创建、查询、更新、删除等操作之前、之后调用的函数:GORM官方文档 | Hook
3 GORM的一些约定
- GORM 默认设置
ID字段为表的主键,可使用gorm:"primary_key"手动设置; - GORM 的表名默认为结构体名称的蛇形复数,并且为小写;
- 结构体字段由两个单词组成时,表对应字段会使用
_分割,并且为小写,可以使用gorm:"column:beast_id"修改。