设计模式之 Database/SQL GORM 实践
学习到了后面,大家对数据库的操作很少使用那种 SQLConnector 的单个接口来一个个链接,而是使用像ORM这种模型来快速编写数据库的设计逻辑,例如在Go中就有很出名的 GORM 和 Ent。 今天让我们一起来研究下 GORM吧!
课前导读:
本节课开始之前,请同学们先了解以下背景知识:
1. 理解 database/SQL
1.1 基本用法 Quick Start
1.2 设计原理
采用了极简接口设计原则,对上层应用采用标准API操作接口。对下层驱动暴露简单的驱动联系接口,在 database/sql 包
支持不同的数据库只需要支持
连接池 池化技术
3. GORM 设计原理
-
SQL 是怎么生成的
-
插件是怎么工作的
-
ConnPool 是什么
-
Dialector
3.1 SQL 是怎么生成的
SQL Statement:
GORM Statement:
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 实现:
Finisher Method 实现:
为什么这么设计:
-
自定义 Clause Builder
-
方便扩展 Clause
-
自由选择 Clauses
自定义 Builder
不同的数据库甚至不同版本的数据库支持的 SQL 不同
可以请求版本,然后再判断生成什么版本。
扩展子句:
一个 Statement 由多个子句构成。根据当前 Statement的类型,取出所有支持的子句,然后把所有子句编译成最终的SQL。在编译过程中生成子句时也提供了一些扩展性接口。
选择子句:
3.2 插件是怎么工作的
执行 Finisher Method,会检查 Statement 类型,根据变量类型的 Statement 去取出对应哪些 Callbacks,在这些 Callbacks 里将 Statement 翻译成最终的 SQL,然后放到数据库进行执行。
默认给每一组的模式都对应一组 Callback。