Go框架GORM基本介绍
GORM框架地址: github.com/go-gorm/gor…
01. Gorm 的基本使用
- Gorm的约定(默认)
- Gorm使用名为 ID 的字段 作为主键
- 使用结构体的 蛇形负数作为表名
- 字段名的蛇形作为列名
- 使用 CreatedAt、UpdatedAt 字段作为创建、更新时间
02. GORM 支持的数据库
GORM 目前支持 MySQL、SQLServer、 PostgreSQL、SQLite。
GORM 通过驱动来连接数据库,如果需要连接其它类型的数据库,可以复用/自行开发驱动。
什么是 DSN github.com/go-sql-driv…
03. GORM 创建数据
-
如何使用 Upsert?
使用 clause.OnConflict 处理数据冲突
-
如何使用默认值?
通过使用 default 标签为字段定义默认值
04. GORM查询数据
1. First 的使用踩坑
- 使用 First 时,需要注意查询不到数据会返回 ErrRecordNotFound.
- 使用 Find 查询多条数据,查询不到数据不会返回错误
2. 使用结构体作为查询条件
当使用结构作为条件查询时,GORM只会查询非零值字段。这意味着如果您的字段值为 0、''、false 或其他零值,该字段不会被用于构建查询条件,使用Map 来构建查询条件。
05. GORM更新数据
使用 Struct 更新时,只会更新非零值,如果需要更新零值可以使用 Map 更新或使用Select 选择字段
06. GORM删除数据
GORM 提供了 gorm.DeletedAt 用于帮助用户实现软删。
拥有软删除能力的 Model 调用 Delete 时,记录不会被从数据库中真正删除。但 GORM 会将 DeletedAt 置为当前时间,并且你不能再通过正常的查询方法找到该记录。
使用 Unscoped 可以查询到被软删的数据。
物理删除
软删除
07. GORM事务
Gorm 提供了 Begin、Commit、 Rollback 方法用于使用事务
Gorm 提供了 Tansaction 方法用于自动提交事务,避免用户漏写 Commit、Rollbcak。
08. GORM Hook
GORM提供了 CURD 的 Hook 能力
Hook 是在创建、查询、更新、删除等操作之前、之后自动调用的函数。
如果任何 Hook 返回错误,GORM 将停止后续的操作并回滚事务。
09. GORM 性能提高
对于写操作(创建、更新、删除),为了确保数据的完整性,GORM 会将它们封装在事务内运行。但这会降低性能,你可以使用 SkipDefaultTransaction 关闭默认事务。
使用 PrepareStmt 缓存预编译语句可以提高后续调用的速度,本机测试提高大约 35 %左右。
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)。