gorm实战 | 青训营笔记

123 阅读4分钟

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

理解database/sql

image-20220520222714464

image-20220521113711584

image-20220521114316619

image-20220521114621334

image-20220521114732744

image-20220521114843110

image-20220521115021674

image-20220521115311666

database/sql包的目标就是通过一套接口就能操作不同的数据库
在使用不同数据库的时候仅需要切换对应数据库的底层驱动就能使用不同的数据库了

databash/sql包提供了两种接口,分别是提供了一套连接池的接口,以及提供了一套数据库连接的接口,获取不同数据库的连接是需要数据库提供驱动
对连接池配置的方法可以使用set函数对其中的属性赋值
可以使用Stats函数获得连接池的状态

连接接口:
	使用数据库之前需要先去注册驱动,并设置DSN

操作接口:
	DB连接有几种类型,分别是直接连接、预编译、开启事务
	执行sql语句也有几种函数,Exec直接执行并返回结果,Query执行查询语句并返回游标,QueryRow查询一条语句并返回一条结果



GORM使用简介

image-20220521115536416

image-20220521150458243

GORM设计原理

sql的拼接

image-20220521194240276

image-20220521194450923

image-20220521200022180

image-20220521200035041

image-20220521195502812

执行插件

image-20220521195954600

image-20220521195937978

image-20220521203158564

image-20220521203606180

GORM总共有两种功能,一种是如何生成与数据库对应的sql语句,另一种是怎样执行对应数据库的sql语句




GORM执行SQL语句的时候,会先进行插件的调用
create callback的设置
1. 开启事务
2. 执行这个model有哪些before create的方法
3. 保存前置的关联,比如一个create方法中可能还会包含其他对象,其他对象也需要创建或者是更新
4. gorm statement翻译成最终的sql并发送到数据库进行执行
5. 保存后置的关联,比如其他外键依赖于返回的值
6. after create
7. 检查执行是否出错,如果出现错误则执行回滚

GORM提供了修改插件的接口
比如开启、关闭、添加、删除、调序等

多租户的实践:在所有增删改查操作之前添加一个函数,使得每个租户查改的都是自己的信息而不会查询到其他租户的信息,后续业务开发都不需要指定租户ID
多数据库分离:执行某些特定语句的数据库,比如user使用db1,order使用db8




ConnPool

image-20220521204731551

image-20220521204521783

image-20220521205514045

image-20220521205848863

自动判断当前sql的执行,查看是写还是读还是开启了一个事务

ConnPool会提供sql预编译并缓存的功能,实现的是database/sql提供的接口,也就是相同的sql只会进行一次解析,会加快运行速度

全局模式:所有sql都会预编译以及缓存,但缓存是有上限的
会话模式:当前回话中的sql会预编译以及缓存,但会话关闭后就会删除
比如在批量导入的时候,就可以开启这个选项,开启之后就会很大提升性能

GORM真正强大的地方就在于,提供了用户可实现的接口接入到系统中,这时用户就可以自定义查询功能,比如在执行查询语句之前就可以先去查缓存,如果命中缓存就不用再去执行查数据库的操作了。这样一来业务代码就可以专注于业务,而不是在业务代码中考虑查询的逻辑

一点点小tips:
	interpolateParams=false本质上是防止sql注入才进行的预编译,也就是在执行所有sql之前都会进行预编译操作,并且使用完就丢弃。这种操作在现代代码中基本不会出现该类型的错误,所以可以关闭这种预编译操作


GORM最佳实践

image-20220521210340177

image-20220521210603307

image-20220521212324064

SQL表达式

image-20220521214634399

image-20220521212627110

image-20220521212635494

批量数据操作

image-20220521212851562

image-20220521213159586

image-20220521213310370

代码复用

image-20220521213543070

image-20220521213801194

image-20220521213810594

混沌工程/压测

image-20220521214744591

image-20220521214057686

Logger

image-20220521214141821

数据库迁移管理

image-20220521214237710

image-20220521214313652

Gen代码生成

image-20220521214327093

image-20220521214513213

安全

image-20220521215006939

sql表达式:
复杂数据类型的管理

批量操作:
批量数据的创建与查询
查询返回的是一个迭代器,这样可以不用将大量数据全部拷贝到内存,以致于系统发生OOM的情况,对处理大量数据也有好处,但是一次查询大量数据会导致数据库直接挂掉

提升批量操作速度的几个操作:
事务
hooks
预编译
以及混合使用,createbatch方法

代码复用、分库分表、sharding
分页复用
分库分表复用代码
sharding配置

混沌工程/压测
提供一些错误代码,用来检测系统可否发现这些错误
线上环境的压力测试


Logger
全局
会话

Migrator数据库迁移管理

Gen代码生成
类似于mybatisplus,预写了很多代码,最后执行的时候直接调用即可

安全问题