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可以进行数据库的一个扩展。学习了多数据库和读写分离,在这一部分的内容中,还有很多知识不能够理解,不太能听懂,后期下来还需要再看些文档巩固一遍。总体来看,这部分的内容目前对我来说还是有点难以理解,现在掌握的知识看这些代码还存在一定的困难。