这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天,今天的学习内容是Go 框架三件套详解(Web/RPC/ORM)。
Gorm
Gorm是一个已经迭代了10年+的功能强大的ORM框架,有非常丰富的开源扩展。
Gorm目前支持的数据库有MySQL SQLServer PostgreSQL SQLite。
Gorm的约定
- Gorm使用名为ID的字段作为主键
- 使用结构体的蛇形负数作为表名
- 字段名的蛇形作为列名
- 使用CreatedAt、UpdatedAt字段作为创建、更新实践
规范命名格式一般分为两种,一种是驼峰aliceAndBob AliceAndBob,另一种是蛇形alice_and_bob。
Gorm的用法
首先创建一个结构体,代表表名,里面的内容就是表的结构。例如:
type Product struct {
Code string
Price uint
DeleteTime gorm.DeletedAt //声明这个变量实现软删除
}
使用Unscoped查询软删除的数据
再创建一个函数TableName返回值为要查的表的表名。
func (p Product) TableName() string {
return "product"
}
然后用gorm.Open连接数据库。
CRUD用法可以看官方文档:创建 | CRUD 接口 |《GORM 中文文档 v2》| Go 技术论坛 (learnku.com)
- 写的时候会进行链式调用,调用到最后的CRUD就会结束了,所以约束要放在前面。
- 在查询的时候,使用
First会按照主键查询到第一个满足要求的数据之后返回,但是如果没有查询到的话,会返回ErrRecordNotFound,所以更多时候使用Find来查询语句,查询不到数据也不会返回错误。 - 当使用结构作为查询条件时,GORM只会查询非零值字段,如果要查询包含零值的字段,需要使用
map,例如:
//SELECT * FROM product WHERE Code = '0'
db.Where(&Product{Code: "0", Price: 0}).Find(&product)
//SELECT * FROM product WHERE Code = '0' AND Price = 0
db.Where(map[string]interface{}{"Code": "0", "Price": 0}).Find(&product)
- 当使用结构更新时,也是只会更新非零列,如果要更新零值需要使用
map或者使用Select指定那一列。
Gorm事务
使用Begin Commit Rollback处理事务。提供了Transaction自动提交事务,避免用户漏写Commit Rollback。
Gorm Hook
Gorm给CRUD提供Hook能力,如果任何Hook发生错误,GORM将停止后续的操作并回滚事务。 Gorm Hook官方文档:钩子 | 教程 |《GORM 中文文档 v2》| Go 技术论坛 (learnku.com)
Gorm性能提高
- 使用
SkipDefaultTransaction关闭默认事务 - 使用
PrepareStmt缓存预编译语句