设计模式之database/sql 与Gorm设计原理


1.0 理解 database/sql

1.1 基本用法 - Quick Start

上面有几行错误

DSN相关知识:

https://github.com/go-sql-driver/mysql#dsn-data-source-name

https://en.wikipedia.org/wiki/Data_source_name

完整:

1.2 设计原理

极简接口设计原则:

对 上层应用 提供标准API接口;对下层暴露简单 驱动接口;内部实现连接池管理

实现不同的数据库驱动就是实现一个额外链接、操作接口。而暴露给应用程序的接口不变,以此实现应用程序使用不同的数据库driver。

连接池使用了池化技术,当遇到请求量大的情况,池化技术就可以提升效率。把昂贵、费时的资源放入特定的池子中,减少创建、销毁、垃圾回收的损耗。

连接池配置 set链接 最大连接数等 或者 取出连接状态;

默认的maxBadConnRetries是默认两次:默认重试两次,

第三行 获取链接conn之后有两种策略:

1、尽量呼应,复用连接池里原来的链接;2、新建连接;

重试的前几次 都尽量复用原来的链接,前面都出错的话 会在最后一次 强制新建连接

获取链接之后 defer操作 把链接放回连接池 有校验操作 满足需求 才放到 连接池 否则直接丢弃

用链接实现driver等操作;

for循环的最后判断error.Is上面的过程中 有没有 任何错误 如果有isBadConn错误 就继续for循环到maxBadConnRetries次数,这个循环过程中 有!isBadConn 就跳出循环;

存在问题maxBadConnRetries不能指定

import顺序不对 也有可能引发初始化异常

缺点:driver的名字可能长而难记,不同人的driver名字不能冲突,后来者使用名字会被提示名字被占用。

新版本的go支持使用结构体:

DB连接的类型:

直接连接/Conn :简单的TCP链接

预编译/Stmt

prepare statement :执行同样sql时,预先prepare 生成prepare statement uid,根据uid执行同样sql时,不用传sql 直接传id 减少传输,解sql时间

事务/Tx :基本知识

处理返回数据的几种方式(接口)

Exec / ExecContext -> Result:执行sql,获取sql执行的结果是否成功和last insert id;

Query / QueryContext -> Rows (Columns):把数据库请求之后的结果 通过行形式 返回;

QueryRow / QueryRowContext -> Row (Rows 简化) 上面的简化格式 只读取rows的一行 并close;

2.0 Gorm使用简介(Go Object Realation Mapping)

ORM 是通过实例对象的语法,完成关系型 数据库的操作,是"对象-关系映射"(Object/Relational Mapping) 的缩写

2.1 背景知识

2.2 基本用法—CRUD

2.3 模型定义

这个database/sql包 还提供了 value和scanner接口,能处理稍微复杂的模型;

通过匿名struct 嵌套了下面的gorm.Modul(老师没有说哪个套哪个,但我个人觉得是上面的嵌套了下面的)

常见的软件设计范式:

配置参考:https://gorm.io/docs/conventions.html

2.4 关联介绍

2.4.2 关联操作—CRUD

2.4.3 关联操作—Preload/Joins 预加载

避免 查询某一用户时 要查每个用户的相关关联 产生N+1sql操作;

2.4.4 关联操作—级联删除

保障没有孤儿数据

3.0 Gorm设计原理

Gorm在代码中的位置:

Gorm相当于在database包上面加了一层,负责和应用程序进行交互。

3.1 SQL是怎么生成的

Chain Method :给Gorm Statement 添加Gorm 子句的方法

Finisher Method :决定Statement 最终类型 并执行的方法:Find 就是select;Create就是 insert Statement

把当前参数 翻译成Gorm的子句

3.1.0 为什么这样设计(clause :子句)

3.1.1 自定义Builder

Gorm的目标是 :解决不同版本数据库支持的SQL不同

将细节隐藏起来,只需要实现一套Gorm代码即可

3.1.2 扩展子句

3.1.3 选择子句

3.2插件怎么工作

Create()的七个方法:

开启事务;create前的操作;保存前置关联;create 把Statement翻译成最终的SQL;后置关联;after_create;最后一步 判断整体流程是否出错;出错rollback 否则commit;

3.2.1多租户

感觉有点看不懂了

下次再见

4.0 Gorm最佳实践

4.1数据序列化与 SQL 表达式 — SQL 表达式更新创建

下次再见

总结

Go使用SQL与类SQL数据库的惯例是通过标准库database/sql。这是一个对关系型数据库的通用抽象,它提供了标准的、轻量的、面向行的接口。不过database/sql的包文档只讲它做了什么,却对如何使用只字未提。快速指南远比堆砌事实有用,本文讲述了database/sql的使用方法及其注意事项。

posted @ 2023-06-03 15:31  软工菜鸡  阅读(61)  评论(0编辑  收藏  举报  来源