这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记。
一、理解database/sql
1.1 基本用法 Quick Start
import (
"database/sql"
"github.com/go-sql-driver/mysql"
)
- import driver实现,使用driver+DSN初始化DB连接
- 执行一条SQL,通过rows取回返回的数据;处理完毕,需要释放连接
- 数据,错误处理
Plus
DSN(数据源名称):
1.2 设计原理
连接池:池化技术
Driver连接接口
1.3 基础概念
DB连接的几种类型:
- 直接连接/Conn
- 预编译/Stmt
- 事务/Tx
处理返回数据的几种方式:
- Exec/ExecContext -> Result
- Query/QueryContext -> Rows(Columns)
- QueryRow/QueryRowContext -> Row(Rows简化)
二、GORM使用简介
2.1 基本用法
“设计简介、功能强大、自由扩展的全功能ORM”
CRUD
2.2 Model定义
2.3 惯例约定
2.4 关联操作
CRUD
Preload/Joins 预加载
级联删除
三、GORM设计原理
3.1 SQL生成
SELECT `name`, `age`, `employee_number`
FROM `users`
WHERE
role <> "manager" AND
age > 35
ORDER BY age DESC
LIMIT 10 OFFSET 10
FOR UPDATE
流程图解:
为什么?
- 自定义Clause Builder
- 方便扩展 子句
- 自由选择 Clauses
3.2 插件扩展(怎么工作的?)
六种callbacks
Callback--Create
为什么?
- 多租户
- 多数据库读、写分离
- 加解密、混沌工程
3.3 ConnPool
Prepare Stmt实现:
- 查找缓存的预编译SQL
- 未找到,将收到的SQL和Vars预编译
- 使用缓存的预编译SQL执行
3.4 Dialector
四、GORM最佳实践
4.1 最佳实践
- 数据序列化与SQL表达式
SQL表达式更新与创建:
SQL表达式查询:
数据序列化:
- 批量数据操作 批量创建/查询:
批量更新:
批量数据加速操作:
- 代码复用、分库分表、Sharding
db.Scopes
-
混沌工程、压测
-
Logger/Trace
- Migrator 数据库迁移
- Gen 代码生成/Raw SQL
- 安全
SQL注入等?
4.2 FAQ
- GORM支持动态SQL
- 点赞和取消点赞:在数据库中记录什么时候创建、取消等
- insert对应的Save和Create,Save若ID存在,则调用Update