这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
Gorm的基本使用
只用first会出现问题,记得传入指针
更新数据,可以用.table。更新零值用map
gorm创建数据
链式调用 res.Error,遇到冲突,clause.OnConflict{DoNothing" true}
默认值 default 标签
GORM查询数据
使用first时,查询不到数据会返回 ErrRecordNotFound,所以使用find查询多条数据,查询不到会返回空数组
可以用select api选定字段
使用结构体作为查询条件:当使用结构体作为查询条件的时候,GORM只会查询非零值字段。这意味着如果字段值为0、‘’、false或其他零值,该字段不会被用于构建查询条件,使用Map来构建查询条件。
GORM更新数据
使用Struct更新时,只会更新非零值,如果需要更新零值,可以使用Map更新或使用Select选择字段
可以使用gorm.Expr表达式更新
GORM删除数据
物理删除是真删除了,实际开发中要使用软删除。
软删除:gorm会将DeleteAt置为当前时间,并且不能再通过正常的查询方法找到该记录,可以使用Unscoped查询到被软删的数据。
按规范编写代码,天然支持防SQL注入
GORM事务
GORM提供了Begin、Commit、Rollback方法用于使用事务
在事务中执行一些db操作,应该使用tx而不是db
忘记rollback可能会导致连接泄露
gorm提供了Transaction方法用于自动提交事务,避免用户漏写Commit、Rollback
GORM Hook
GORM在提供了CURD的Hook能力,Hook是在创建、查询、更新、删除等操作之前、之后自动调用的函数。如果任何Hook返回错误,GORM将停止后续的操作并回滚事务。
GORM性能提高
SkipDefaultTransacton关闭默认事务,使用PrepareStmt缓存预编译语句提高后续调用速度,
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…