设计模式之 Database/SQL 与 GORM 实践 | 青训营笔记

131 阅读2分钟

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

一、理解database/sql

1.1 基本用法 Quick Start

import (
    "database/sql"
    "github.com/go-sql-driver/mysql"
)
  1. import driver实现,使用driver+DSN初始化DB连接
  2. 执行一条SQL,通过rows取回返回的数据;处理完毕,需要释放连接
  3. 数据,错误处理

Plus
DSN(数据源名称):

1.2 设计原理

连接池:池化技术 image.png

Driver连接接口 image.png

1.3 基础概念

DB连接的几种类型:

  • 直接连接/Conn
  • 预编译/Stmt
  • 事务/Tx

处理返回数据的几种方式:

  • Exec/ExecContext -> Result
  • Query/QueryContext -> Rows(Columns)
  • QueryRow/QueryRowContext -> Row(Rows简化)

二、GORM使用简介

2.1 基本用法

“设计简介、功能强大、自由扩展的全功能ORM” image.png CRUD image.png

2.2 Model定义

image.png

2.3 惯例约定

image.png

2.4 关联操作

CRUD image.png

Preload/Joins 预加载 image.png

级联删除 image.png

三、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

流程图解:

image.png

为什么?

  • 自定义Clause Builder
  • 方便扩展 子句
  • 自由选择 Clauses

3.2 插件扩展(怎么工作的?)

六种callbacks image.png

Callback--Create image.png

为什么?

  • 多租户
  • 多数据库读、写分离
  • 加解密、混沌工程

3.3 ConnPool

image.png

Prepare Stmt实现:

  • 查找缓存的预编译SQL
  • 未找到,将收到的SQL和Vars预编译
  • 使用缓存的预编译SQL执行

3.4 Dialector

image.png

四、GORM最佳实践

4.1 最佳实践

  1. 数据序列化与SQL表达式

SQL表达式更新与创建: image.png

SQL表达式查询: image.png

数据序列化:

image.png

  1. 批量数据操作 批量创建/查询:

image.png

批量更新:

image.png

批量数据加速操作:

image.png

  1. 代码复用、分库分表、Sharding

db.Scopes image.png

  1. 混沌工程、压测 image.png

  2. Logger/Trace

image.png

  1. Migrator 数据库迁移

image.png

  1. Gen 代码生成/Raw SQL

image.png

  1. 安全 SQL注入等? image.png

4.2 FAQ

  1. GORM支持动态SQL
  2. 点赞和取消点赞:在数据库中记录什么时候创建、取消等
  3. insert对应的Save和Create,Save若ID存在,则调用Update