这是我参与「第三届青训营 -后端场」笔记创作活动的的第五篇笔记
理解database/sql
基本用法
如下图,这里前九行是先引入依赖,再使用driver + DSN 初始化 db 连接
接下来10到14行,执行SQL语句,这里是查询id为1的行,通过rows取回返回的数据,处理完毕后,需要用释放连接
然后16到26行是数据和错误处理,最后28到30行是错误处理
设计原理
设计原理部分比较复杂,这里不是很搞得懂不具体讲,可以看看下面这个图。
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
- 混合使用