Go框架GORM基本介绍 | 青训营

115 阅读2分钟

Go框架GORM基本介绍

GORM框架地址: github.com/go-gorm/gor…

01. Gorm 的基本使用

gorm.cn/zh_CN/docs/…

  • Gorm的约定(默认)
  • Gorm使用名为 ID 的字段 作为主键
  • 使用结构体的 蛇形负数作为表名
  • 字段名的蛇形作为列名
  • 使用 CreatedAt、UpdatedAt 字段作为创建、更新时间

image.png  

02. GORM 支持的数据库

gorm.cn/zh_CN/docs/…

GORM 目前支持 MySQL、SQLServer、 PostgreSQL、SQLite。

GORM 通过驱动来连接数据库,如果需要连接其它类型的数据库,可以复用/自行开发驱动。

什么是 DSN github.com/go-sql-driv…

image.png

03. GORM 创建数据

gorm.cn/zh_CN/docs/…

  1. 如何使用 Upsert?

    使用 clause.OnConflict 处理数据冲突

    1691757450904.jpg

  2. 如何使用默认值?

    通过使用 default 标签为字段定义默认值 1691757691232.jpg

04. GORM查询数据

gorm.cn/zh_CN/docs/…

1. First 的使用踩坑

  • 使用 First 时,需要注意查询不到数据会返回 ErrRecordNotFound.
  • 使用 Find 查询多条数据,查询不到数据不会返回错误

2. 使用结构体作为查询条件

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

1691758273838.jpg

05. GORM更新数据

gorm.cn/zh_CN/docs/…

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

06. GORM删除数据

gorm.cn/zh_CN/docs/…

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

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

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

物理删除 image.png 软删除 1691758528834.jpg

07. GORM事务

gorm.cn/zh_CN/docs/…

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

1691758670067.jpg

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

image.png  

08. GORM Hook

gorm.cn/zh_CN/docs/… 

GORM提供了 CURD 的 Hook 能力

Hook 是在创建、查询、更新、删除等操作之前、之后自动调用的函数。

如果任何 Hook 返回错误,GORM 将停止后续的操作并回滚事务。

1691758930728.jpg  

09. GORM 性能提高

gorm.cn/zh_CN/docs/…

对于写操作(创建、更新、删除),为了确保数据的完整性,GORM 会将它们封装在事务内运行。但这会降低性能,你可以使用 SkipDefaultTransaction 关闭默认事务。

使用 PrepareStmt 缓存预编译语句可以提高后续调用的速度,本机测试提高大约 35 %左右。

image.png

10. GORM 生态

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 用法可以查看 Gorm 的文档(gorm.cn)。