GROM设计原理 |青训营笔记

76 阅读2分钟

GROM设计原理

一、SQL是怎么生成的

1.在生成SQL语句时,用多个GORM子句添加生成最终的执行语句。 以下为一个GORM语句:

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

GORM可以看成是参考了Select语句的一个仿生设计。

二、自定义Builder

要注意不同的数据库支持的SQL是不同的,自定义Builder可以进行数据库的一个扩展。

扩展子句
import"gorm.io/hints"

//扩展SELECT Clause后
db.Clauses(hints.New("MRR(idx1)")).Find(&User{})

//扩展FROM Clause后
db.Clauses(hints.UseIndex("idx_user_name")).Find(&User{})
db.Clauses(hints.ForceIndex("idx_user_name","idx_user_id").ForJoin()).Find(&User{})
选择子句

DB自定义 Clauses

// PostgreSQL
DELETE FROM users WHERE condition

//排序语句
//MySQL
DELETE FROM users WHERE condition ORDER BY age desc LIMIT 100
//其中desc为降序排序

三、插件

Finisher Method->决定Statement类型
->执行Callbacks->生成SQL并执行

在执行Creat的过程中,依次调用注册的Create Callbacks

//创建对象
db.Create(&Product{Code:"L1212",Price:1000})

//GROM找出Create所注册的所有方法,并一一调用
func Create(data interfacce{})error{
//..伪代码
for _, f:=range db.callbacks.creates{
f()
}
}
//注册新Callback
db.Callback().Create().Register("myplugin",func(*gorm.DB){})

//删除Callback
db.Callback().Create().Remove("gorm:begin_transaction")

//替换Callback
db.Callback().Create().Replace("gorm:before_create",func(*gorm.DB){})

//查询注册的Callback
db.Callback().Create().Get("gorm:create")
多数据库、读写分离

主数据库:写数据
从数据库:读数据

GORM-->ConnPool-->数据库
用DB Conn实现ConnPool接口

在全局模式中,所有DB操作都会预编译并缓存(缓存不含参数部分)。
会话模式中,后续会话的操作都会预编译并缓存。
同时,全局缓存的语句是可以被会话使用的。

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

收获

在本节内容中,学习了GROM的设计原理,知道了SQL是如何生成的,我们认为GORM可以看成是参考了Select语句的一个仿生设计。认识了Builder,了解到自定义Builder可以进行数据库的一个扩展。学习了多数据库和读写分离,在这一部分的内容中,还有很多知识不能够理解,不太能听懂,后期下来还需要再看些文档巩固一遍。总体来看,这部分的内容目前对我来说还是有点难以理解,现在掌握的知识看这些代码还存在一定的困难。