三件套之Gorm篇 | 青训营笔记

104 阅读2分钟

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

课堂笔记

一、本堂课重点内容:

  • Gorm框架

二、具体案例:

1. Gorm介绍

Gorm是一个已经迭代了10年+的功能强大的ORM框架,在字节内部被广泛使用并且拥有非常丰富的开源扩展。

2. Gorm基础使用

2.1 下载链接数据库驱动

go get -u gorm.io/gorm

go get -u gorm.io/driver/mysql

2.2 连接
dsn := "root:123456@tcp(127.0.0.1:3306)/community?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(
   mysql.Open(dsn),
   &gorm.Config{})
if err != nil {
   panic("failed to connect database")
}
2.3 定义gorm model
type Product struct {
   Price uint
   Code  string
}
2.4 字段创建
db.Create(&Product{Code: "D42", Price: 100})
2.5 字段查找
var product Product
db.First(&product, 1)                 // 根据整形主键查找
db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录
2.6 字段更新
// Update - 将 product 的 price 更新为 200
db.Model(&product).Update("Price", 200)
// Update - 更新多个字段
db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段
db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})
2.7 字段删除

硬删除

// Delete - 删除 product
db.Delete(&product, 1)

软删除

GORM提供了gorm.DeletedAt 用于帮助用户实现软删

拥有软删除能力的Model 调用Delete时,记录不会被从数据库中真正删除。但 GORM会将DeletedAt置为当前时间,并且你不能再通过正常的查询方法找到该记录。

使用Unscoped可以查询到被软删的数据

2.8 使用clause.OnConflict处理数据冲突

image.png

2.9 First的使用踩坑

使用 First 时,需要注意查询不到数据会返回ErrRecordNotFound。

使用 Find查询多条数据,查询不到数据不会返回错误。

2.10 使用结构体作为查询条件

当使用结构作为条件查询时,GORM 只会查询非零值字段。这意味着如果您的字段值为0、"、false或其他零值,该字段不会被用于构建查询条件,使用Map来构建查询条件。

2.11 使用结构体作为更新条件

使用Struct 更新时,只会更新非零值,如果需要更新零值可以使用Map更新或使用Select 选择字段。

2.12 事务

Gorm提供了Begin、Commit、Rollback方法用于使用事务

image.png

Gorm提供了Tansaction方法用于自动提交事务,避免用户漏写Commit、Rollbcak.

image.png

2.13 Gorm Hook

GORM在提供了CURD的Hook 能力。 Hook是在创建、查询、更新、删除等操作之前、之后自动调用的函数。 如果任何Hook返回错误,GORM将停止后续的操作并回滚事务。

image.png

2.14 Gorm 生态

GORM拥有非常丰富的扩展生态,以下列举一部分常用扩展。

GORM代码生成工具github.com/go-gorm/gen
GORM分片库方案github.com/go-gorm/sha…
GORM手动索引github.com/go-gorm/hin…
GORM乐观锁github.com/go-gorm/opt…
GORM读写分离github.com/go-gorm/dbr…
GORM OpenTelemetry扩展github.com/go-gorm/ope…

三、课后个人总结

从课程来讲,gorm的生态已经在逐渐越来越丰富,相比较于其他语言,也有属于自身的优势与强大之处。