设计模式之 DatabaseSQL 与 GORM 实践(五)|青训营笔记

设计模式之 DatabaseSQL 与 GORM 实践(五)|青训营笔记

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

本章目录:

image-20220602211652847

理解database/sql

基本用法

首先配置GO的环境,把GoPath配置好:https://blog.csdn.net/qq_40027172/article/details/118828110

可以查看官网中给出的包的示例,我们先了解一下DSN(Data Source Name)是什么:

image-20220604153348997
其实就是连接的一行。。里面有着ip地址和参数之类的数据,在很多地方可以用“连接字符串”替代。
image-20220604162541722
这段代码就是获取数据库中users的值

和大多数的数据库连接类似,给出连接ip和密码以及连接参数,有执行语句,但是一定要记得defer关闭,虽说rows.Next()也可以关闭,但是保不准会出现错误直接return了。

设计原理

image-20220604154449061

连接池是为了分担连接压力,更好的复用连接。
DSN会需要字符串,但是有些字符串可能无法转义。
需要一直import Driver。

所以后来做成了结构体。
image-20220604162027033

这样就不会忘记import,因为有强制的编译的检查。

image-20220604162014871

GORM基础使用

背景知识

image-20220604162335922

基本用法

image-20220604162727323
和之前的长代码一样的内容,但是简洁了很多。

CRUD

image-20220604163616559

Model定义

image-20220604163806566

例如User表应当被命名为users。

关联操作

image-20220604163923510

关联的CRUD
image-20220604164031521

Preload/Joins 预加载
image-20220604164205650

级联删除
image-20220604164234956

GORM设计原理

image-20220604164546213

SQL是怎么生成的

SQL本来的样子:
image-20220604164654135
GORM的实现:
image-20220604165030852
Chain Method如何实现的:
image-20220604165118031

Finisher实现:
image-20220604165154666
为什么这样子设计:
image-20220604165249951
自定义Builder:
image-20220604165449797
扩展字句:
image-20220604165616429
选择字句:
image-20220604165817917

插件是怎么工作的

image-20220604165937226
image-20220604170154936

image-20220604170225483
注册的新的Callback会在上面的所有之后执行。

为什么要这样设计:
image-20220604170309965

多租户:
image-20220604170515969
搞一个过滤器。

多数据库、读写分离:
image-20220604170852855

ConnPool

是什么:
image-20220604171120738

预编译:
image-20220604171405173

image-20220604171642370

一行代码提升效率:关闭预编译?
image-20220604171957251

Dialector

字节封装的bytegorm,一套sql规范。
image-20220604172206011

借助Dialector实现,Dialector是什么:
image-20220604173818792
橙色的就是Dialector

image-20220604173924443

GORM最佳实践

image-20220604174144884

数据序列化与SQL表达式

  1. 表达式更新创建
    image-20220604174745744
  2. SQL表达式查询
    image-20220604174811530
  3. 数据序列化
    image-20220604174923544

批量数据操作

  1. 批量创建/查询
    image-20220604175941457
    避免大量数据读到内存产生OOM的问题,所以上面可以100条100条的查询。
  2. 批量更新
    image-20220604180032632
  3. 批量数据加速操作
    image-20220604180109117

代码复用、分库分表、Sharding

  1. 代码复用
    image-20220604180352986
  2. 分库分表
    image-20220604180416620
  3. Sharding
    image-20220604180623107

混沌工程/压测

image-20220604180714101

image-20220604180836006

Logger/Trace

image-20220604180928257

Migrator

image-20220604181222762

Gen代码生成

Raw SQL - Raw SQL:
image-20220604181254134
Raw代码多了不好管理好像

Raw SQL - Gen:
image-20220604181425093

安全问题

image-20220604181508136

posted @ 2022-06-04 18:19  杀戒之声  阅读(159)  评论(0编辑  收藏  举报