设计模式之database sql与GROM实践 | 青训营笔记

185 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第五篇笔记

理解database/sql

基本用法

如下图,这里前九行是先引入依赖,再使用driver + DSN 初始化 db 连接

接下来10到14行,执行SQL语句,这里是查询id为1的行,通过rows取回返回的数据,处理完毕后,需要用释放连接

然后16到26行是数据和错误处理,最后28到30行是错误处理

1655192411990.png

设计原理

设计原理部分比较复杂,这里不是很搞得懂不具体讲,可以看看下面这个图。

1655193802263.png

DB连接的几种类型

  • 直接连接/Conn
  • 预编译/Stmt
  • 事务/Tx 通常用直接连接即可

处理返回数据的几种方式

具体操作方法可以看看这个链接:go操作MySQL · Go语言中文文档 (topgoer.com)

  • Exec/ExecContext -> Result (可以对数据库进行插入,修改,删除的操作)
  • Query/QueryContext -> Rows (Columns) (可以对数据库进行查询操作)
  • QueryRow/QueryRowContext -> Row (同样是查询,但是只会返回单行数据,只要查询到一行就会停止查询)

GORM基础使用

GORM 是一款设计简洁、功能强大、自由扩展的全功能ORM

可以看看GORM的文档

英文文档:GORM Guides | GORM - The fantastic ORM library for Golang, aims to be developer friendly.

中文文档:连接数据库 | 入门指南 |《GORM 中文文档 v2》| Go 技术论坛 (learnku.com)

基本用法

建立driver

db, err := gorm.Open(
    mysql.Open("user:password@tcp(127.0.0.1:3306)/hello")
)

select操作

var user User
err = db.Select("id","name").Find(&users, 1).Error

模型定义

约定优于配置

下面是一些惯例约定

  • 表名是 stuct name 的复数格式
  • 字段名是field name 的单数格式
  • ID / Id 字段为主键,如果是数字,则为自增主键
  • CreatedAt 字段,创建时保存当前时间
  • UpdatedAt 字段,创建、更新时保存当前时间
  • DeletedAt 字段,默认开启 soft delete 模式

GORM 实践

SQL表达式更新创建

  • 通过gorm.Expr来使用SQL表达式
  • 使用GORMValuer来使用SQL表达式
  • 通过*gorm.DB使用SubQuery

SQL表达式查询

  • 使用gorm.Expr
  • Struct定义GORMValuer
  • 自定义查询SQL实现接口clause.Expression
  • 使用SubQuery

批量创建/查询

使用CreateInBatches()方法,以某个数量为单位进行分组创建

使用FindInBatches()方法,以某个数量为单位进行分组查找

批量数据加速操作

  • 关闭默认事务
  • 默认批量导入回调用 Hooks 方法,使用Skiphooks跳过
  • 使用 Prepared Statement
  • 混合使用