设计模式之 DatabaseSQL 与 GORM 实践(五)|青训营笔记
设计模式之 DatabaseSQL 与 GORM 实践(五)|青训营笔记
这是我参与「第三届青训营 -后端场」笔记创作活动的的第五篇笔记。
本章目录:
理解database/sql
基本用法
首先配置GO的环境,把GoPath配置好:https://blog.csdn.net/qq_40027172/article/details/118828110
可以查看官网中给出的包的示例,我们先了解一下DSN(Data Source Name)是什么:
其实就是连接的一行。。里面有着ip地址和参数之类的数据,在很多地方可以用“连接字符串”替代。
这段代码就是获取数据库中users的值
和大多数的数据库连接类似,给出连接ip和密码以及连接参数,有执行语句,但是一定要记得defer关闭,虽说rows.Next()也可以关闭,但是保不准会出现错误直接return了。
设计原理
连接池是为了分担连接压力,更好的复用连接。
DSN会需要字符串,但是有些字符串可能无法转义。
需要一直import Driver。
所以后来做成了结构体。
这样就不会忘记import,因为有强制的编译的检查。
GORM基础使用
背景知识
基本用法
和之前的长代码一样的内容,但是简洁了很多。
CRUD
Model定义
例如User表应当被命名为users。
关联操作
关联的CRUD
Preload/Joins 预加载
级联删除
GORM设计原理
SQL是怎么生成的
SQL本来的样子:
GORM的实现:
Chain Method如何实现的:
Finisher实现:
为什么这样子设计:
自定义Builder:
扩展字句:
选择字句:
插件是怎么工作的
注册的新的Callback会在上面的所有之后执行。
为什么要这样设计:
多租户:
搞一个过滤器。
多数据库、读写分离:
ConnPool
是什么:
预编译:
一行代码提升效率:关闭预编译?
Dialector
字节封装的bytegorm,一套sql规范。
借助Dialector实现,Dialector是什么:
橙色的就是Dialector
GORM最佳实践
数据序列化与SQL表达式
- 表达式更新创建
- SQL表达式查询
- 数据序列化
批量数据操作
- 批量创建/查询
避免大量数据读到内存产生OOM的问题,所以上面可以100条100条的查询。 - 批量更新
- 批量数据加速操作
代码复用、分库分表、Sharding
- 代码复用
- 分库分表
- Sharding
混沌工程/压测
Logger/Trace
Migrator
Gen代码生成
Raw SQL - Raw SQL:
Raw代码多了不好管理好像
Raw SQL - Gen: