DataBase/SQL & GORM | 青训营笔记

81 阅读2分钟

设计模式之 Database/SQL GORM 实践

学习到了后面,大家对数据库的操作很少使用那种 SQLConnector 的单个接口来一个个链接,而是使用像ORM这种模型来快速编写数据库的设计逻辑,例如在Go中就有很出名的 GORM 和 Ent。 今天让我们一起来研究下 GORM吧!

课前导读:

本节课开始之前,请同学们先了解以下背景知识:

  1. 数据库与 SQL 概念解读

  2. 用 database/sql 建立连接并使用

  3. DSN 相关解读

  4. GORM 解析


1. 理解 database/SQL

1.1 基本用法 Quick Start

1.2 设计原理

采用了极简接口设计原则,对上层应用采用标准API操作接口。对下层驱动暴露简单的驱动联系接口,在 database/sql 包

支持不同的数据库只需要支持

连接池 池化技术


3. GORM 设计原理

  1. SQL 是怎么生成的

  2. 插件是怎么工作的

  3. ConnPool 是什么

  4. Dialector

GORM-design-flows.png

3.1 SQL 是怎么生成的

SQL Statement:

SQL-Statement-gene.png

GORM Statement:

GORM-Statement.png

db.where("role <> ?",”manager“).Where("age > ?",35).Limit(100).Order("age desc").find(&user)

GORM Statement 由若干个 Chain Method 和 Finisher Method 组成。

Chain Method:给 GORM Statement 添加 GORM Clauses 的方法。

GORM Clauses 都会用来生成最终的 SQL。

Finisher Method: 决定 Statement 最终的类型并且进行执行的方法。

Select Statement 的必备子句,橙色部分(SELECT、FROM)。

调用 Finisher Method 时,根据当前类型生成最终的 SQL。

Chain Method 实现:

GORM-chain-method-implement.png

Finisher Method 实现:

GORM-finisher-method-implement.png

为什么这么设计:

  • 自定义 Clause Builder

  • 方便扩展 Clause

  • 自由选择 Clauses

自定义 Builder

GORM-Custom-builder.png

不同的数据库甚至不同版本的数据库支持的 SQL 不同

可以请求版本,然后再判断生成什么版本。

扩展子句:

GORM-extension-clauses.png

一个 Statement 由多个子句构成。根据当前 Statement的类型,取出所有支持的子句,然后把所有子句编译成最终的SQL。在编译过程中生成子句时也提供了一些扩展性接口。

选择子句:

GORM-choice-clauses.png

3.2 插件是怎么工作的

GORM-Plugin-in-work.png

执行 Finisher Method,会检查 Statement 类型,根据变量类型的 Statement 去取出对应哪些 Callbacks,在这些 Callbacks 里将 Statement 翻译成最终的 SQL,然后放到数据库进行执行。

默认给每一组的模式都对应一组 Callback。