设计模式之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的使用方法及其注意事项。
本文来自博客园,作者:软工菜鸡,转载请注明原文链接:https://www.cnblogs.com/SElearner/p/17676649.html