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

news2024/11/16 23:56:14

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的使用方法及其注意事项。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/605067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UNIX环境高级编程——高级I/O

14.1 引言 本章讨论高级I/O相关主题,包括: 非阻塞I/O;记录锁;I/O多路转接(select、poll);异步I/O;readv和writev函数;存储映射I/O(mmap)。 14.…

Hesai激光雷达使用PTP时间同步

PTP是一个网络同步时钟的协议,全称是Precise Time Protocol,也称为IEEE 1588,其有IEEE1588v1和IEEE1588v2两个版本(其中v1版本是为工业自动化测量和控制系统开发的,适用于工业局域网应用。v2版本是在v1版本的基础上&am…

Win11电脑突然没有声音了怎么办?

Win11电脑突然没有声音了怎么办?有用户电脑连接了音响之后,无论自己怎么调整都没有声音,那么遇到这个问题之后,要怎么去进行修复呢?如果你也遇到了没有电脑没有声音的情况,可以通过以下的方法来进行解决。 …

Vue (7)

文章目录 1. 单文件组件1.1 创建 .vue 文件1.2 vue 脚手架1.2.1 说明1.2.2 创建 vue 脚手架1.2.3 了解 vue_test 中的文件 1.2.4 render 函数 1.3 修改默认配置1.4 ref 属性1.5 props 配置项1.6 mixin 混入1.7 插件1.8 Scoped 样式 2. 组件化编码流程2.1 TodoList 案例总结 前言…

Pycharm设置Python每个文件开头自定义模板(带上声明字符编码、作者名、时间等)

Pycharm设置地址: 在File---settings---Editor---File and Code Templates---Python script 脚本里添加: 模板声明设置参考: # ---encoding:utf-8--- # Time : ${DATE} ${HOUR}:${MINUTE} # Author : 作者名 # Email :你的邮箱 # Sit…

Nginx启动,重启以及基本命令

1.启动nginx 进入nginx安装目录执行 ./sbin/nginx -c ./conf/nginx.conf 2.验证nginx配置文件是否正确 方法1. 进入nginx安装目录sbin下,输入命令 ./nginx -t 回显test is successful说明配置正确 方法2. 在启动nginx命令 -c 前加 -t ./sbin/nginx -t -c ./c…

一次诡异405 METHOD_NOT_ALLOWED “Request method ‘POST‘ not supported“问题排查记录

概述 任何稍微只要有一点经验的开发者都知道HTTP 405,表示方法不支持。如,本来是定义为POST接口,前端使用GET请求,就会报错。 但是我还真遇上一次405 METHOD_NOT_ALLOWED "Request method POST not supported"问题&am…

ReadDataByIdentifier(0x22)服务

ReadDataByIdentifier(0x22)服务 ReadDataByIdentifier服务允许客户端从一个或多个dataIdentifiers标识的服务器请求数据记录值。 客户端请求消息包含一个或多个两字节的dataIdentifier值,用于标识服务器维护的数据记录 允许的dataIdentifie…

【Azure】微软 Azure 基础解析(八)Azure 存储服务:探索Blob存储、队列存储、文件存储的特性与适用场景

本系列博文还在更新中,收录在专栏:「Azure探秘:构建云计算世界」 专栏中。 本系列文章列表如下: 【Azure】微软 Azure 基础解析(三)描述云计算运营中的 CapEx 与 OpEx,如何区分 CapEx 与 OpEx…

代码随想录第50天

1.买卖股票的最佳时机III: 动态规划五部曲详细分析一下: 确定dp数组以及下标的含义 一天一共就有五个状态, 没有操作 (其实我们也可以不设置这个状态)第一次持有股票第一次不持有股票第二次持有股票第二次不持有股…

2021年全国A级景区矢量分布数据(11969条)

一、景区定义 旅游景区是以旅游及其相关活动为主要功能或主要功能之一的空间或地域。本标准中旅游景区是指具有参观游览、休闲度假、康乐健身等功能,具备相应旅游服务设施并提供相应旅游服务的独立管理区。该管理区应有统一的经营管理机构和明确的地域范围。包括风景…

设计模式-中介者模式

中介者模式 问题背景中介者设计模式基本介绍原理 问题解决-代码示例注意事项和细节 问题背景 一提到中介,我们首先就能想到租房中介,有租房中介在我们需要租房子的时候可以给我们节省很大精力。 那没有中介我们要怎么租房呢? 我们可以想象一…

English Learning - L3 作业打卡 Lesson4 Day25 2023.5.29 周一

English Learning - L3 作业打卡 Lesson4 Day25 2023.5.29 周一 引言🍉句1: My husband has a good job.成分划分弱读连读爆破语调 🍉句2: He makes enough money to support our family.成分划分弱读连读语调 🍉句3: So we say he brings ho…

防火墙之部署服务器NAT

防火墙部署服务器NAT 原理概述: NAT(Network Address Translation),是指网络地址转换,1994年提出的。 当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址)&a…

离散化以及树状数组

今天我们先来讲一讲什么叫做离散化(简单的映射关系) 一、离散化 一、概念:就是把一个无限的空间去映射到一个有限的空间中去(通俗的可以理解成将数据相应的缩小)为了更好的理解,请看下图: 已知…

90后测试员:“入职阿里,这一次,我决定不跳槽了...”

所谓“舒适”生活 记得上一份工作是去年听从了朋友的意见,“你一定要找一份舒适的工作,这样你一天就有好多时间玩,好多时间干自己想干的事情,摸鱼真香!” 在这份“教导”下,开始了我的找工作之旅&#xf…

Day972.OAuth 2.0是要通过什么方式解决什么问题? -OAuth 2.0

OAuth 2.0是要通过什么方式?解决什么问题? 使用某个App 的时候,是直接使用了第三方帐号(比如微信、微博)登录,还是选择了重新注册新用户?如果选择了重新注册用户,那你还得上传头像、…

DPDK imissed、ierrors、rx_nombuf

在采用DPDK进行网络抓包时常常会通过rte_eth_stats_get函数获取当前网卡的丢包状态,首先看一下该函数的声明: // 函数声明(dpdk-stable-19.11.3/lib/librte_ethdev/rte_ethdev.h) int rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats…

高级程序员和新手小白程序员区别你是那个等级看解决bug速度

IT入门深似海 ,程序员行业,我觉得是最难做的。加不完的班,熬不完的夜。 和产品经理,扯不清,理还乱的宿命关系 一直都在 新需求-做项目-解决问题-解决bug-新需求 好像一直都是这么一个循环。(哈哈哈)我觉得一个好的程序…