一、前言

本篇是搬运之前的笔记,刚用golang的时候,看到mysql的封装部分,总是很好奇为什么会用到那么多的包,例如:

"database/sql"
"github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
"github.com/jmoiron/sqlx/reflectx"
"vitess.io/vitess/go/vt/sqlparser"
"github.com/Masterminds/squirrel"
"github.com/lann/builder"

这些包之间都有什么区别呢?到底哪些才是我们封装mysql需要用到的关键包?

二、解析各种包

参考:Go语言标准库学习之database/sql——数据库管理的利器

1、database/sql

sql包是go官方提供的操作mysql的扩展,主要是提供了操作mysql的方法,比如增删改查,事务等功能。

sql操作的主要方式依赖于原生的sql编写,例如:

db.Query("SELECT * FROM student")

2、go-sql-driver/mysql"

这个包也是go官方提供的mysql驱动包。连接mysql的步骤如下:

1.导入数据库引擎,也就是导入mysql驱动
2.连接数据库: root:password@tcp(host:port)/database?charset=utf8&parseTime=True&loc=Local
3.设置相关参数
4.测试连接

此处的驱动包,主要就是导入mysql驱动,让我们的sql包可以连接到数据库,主要用法如下:

_ "github.com/go-sql-driver/mysql"
db, err := sql.Open("mysql",config)  //第一个参数mysql就是用法哦

使用“_”操作引用包是无法通过包名来调用包中的导出函数,而是只是为了简单的调用其init()函数。导入数据库引擎之后,就可以通过sql包的sql.open()方法连接数据库。

3、sqlx包

参考:
sqlx文档
sqlx使用说明

sqlxGo 的一个包,它在优秀的内置database/sql包之上提供了一组扩展。也就是说。sqlx也是个操作mysql的标准库。

既然sql包已经是官方出的了,那么为什么大家反而更喜欢用sqlx包呢?

(1)安全性database/sql 不会尝试对查询文本进行任何验证;它与编码参数一起按原样发送到服务器。而sqlx提供了专门的参数绑定方法sqlx.DB.Rebind(string) string,支持mysql问号(?)或命名的Prepared Statements,避免SQL注入的安全问题(2)便利相对于原生sql包的query,sqlx.Rowx的主要扩展就是StructScan,可以自动把查下结果扫描到对应结构体中的域(fileld)中。把SQL执行的结果集转化成数据结构(Struct、Maps、Slices)。(3)sqlx的get和select方法Get和Select是一个非常省时的扩展。它们把query和非常灵活的scan语法结合起来。Get和Select在执行查询后就会关闭Rows,并且在执行阶段遇到任何问题都会返回错误。缺点:Select会把整个结果一次放入内存。如果查询结果没有限制特定的大小,那么最好使用Query/StructScan迭代方法。

sqlx包的sql操作方式,也是依赖于原生的sql编写:

db.Query("SELECT * FROM student")

4、reflectx包

sqlx 包有特殊的反射需求。特别是,它需要:

能够将名称映射到字段
了解嵌入式结构
了解通过特定标签将名称映射到字段
用户指定名称 -> 字段映射函数

reflectx包主要扩展了原reflect包,以实现上述目的。

5、squirrel 包 和 Builder包

这两个包主要作用是sql生成器,实现查询构建,用于链式调用。我们知道原生的sql包都是需要自己来手动编写sql的,而程序员是喜欢懒一点,最好是输入首字母就可以自动补全,点点点的链式调用一路莽到底。

(1)sqlx + squirrel 实现

squirrel是go的sql生成器,类似于之前用过的查询构造器,可以实现链式调用,如:
sql, args, err := sq.
Insert("users").Columns("name", "age").
Values("moe", 13).Values("larry", sq.Expr("? + 5", 12)).
ToSql()

(2)builder 包

Builder 最初是为 Squirrel编写的,它是一个流畅的 SQL 生成器。这可能是 Builder 的最佳示例。
Builder通过方法链帮助您为您的库编写流畅的 DSL

6、vitess.io/vitess/go/vt/sqlparser包

注意:这个地址现在已经404了

(1) vitess-sqlparservitess-sqlparser 仅仅是Go语言SQL和DDL解析器(由vitess和TiDB支持)
(2)vitess参考:https://blog.51cto.com/u_15080030/2642755Vitess是一个用于部署、扩展和管理大型mysql实例集群的数据库解决方案。

以上了解了常见的mysql相关的包,怪不得大佬们封装mysql的时候都需要引入这么多的包,环环相扣,从安全性到链式调用,组合封装起来让大家用起来更省劲。

三、sqlx和gorm

1.gorm包

参考:Gorm官方文档

GORM是GoLang中最出色的ORM框架,支持MySQL、PostgreSQL、Sqlite、SQL Server,功能非常
强大,也可以直接执行SQL并获取结果集。主要操作方式是orm的形式,相对于sql扩展包来说,
orm是又进行了更深层次的封装,对于简单sql,使用orm是可以有效提升效率的。orm是object Relational Mapping缩写,object是对象,relational是关系,mapping是映射。
对象关系映射看起来还是蛮抽象的,没错,它就是个抽象概念。从编程语法上来看,
就是在具体的操作业务对象的时候,不需要再去和复杂的SQL语句打交道,只需简单的
操作对象的属性和方法。

gorm也是类似于其他语言的ORM方式操作数据库,更加偏向于一切皆对象。

2、gorm和sqlx的对比

(1)sqlx是一个库,它允许您将整行扫描到您的结构变量中。虽然sqlx减少了为构建 CRUD 而编写的典型行数,但最终仍会多次编写重复代码。
使用 ORM 可以帮助减少它并专注于您的业务逻辑。
(2)针对复杂的sq,比如编写报表的子查询,多表关联操作,orm实现起来可能更加的复杂,使用原生sql反而更好。
(3)效率上参考:https://tech.wmzhe.com/article/97958.html ,显然sqlx效率更高
(4)orm是一个与表映射的类,字段映射成成员变量。当表字段很多的时候,orm类就会很冗长。

其实不管是sqlx还是gorm,对于我们日常的开发来说都是足够使用的,博主呆过的几家公司还是以sqlx为主,ORM虽然方便,但是更加抽象化一点,可能大家觉得sqlx更加容易上手吧。

博主觉得,重要的不是用sqlx还是用gorm重要的是统一标准以及sql层的封装。统一标准是为了代码的可读性和可维护性,sql层封装又是为了防止代码冗余和便于插入洋葱模型中间件,实现服务稳定性的相关指标。

3、封装sql关注的点有哪些

(1)读取中心配置,连接mysql,比如apollo等
(2)添加洋葱模型,例如添加trace,spanID,requestId等分布式链路追踪到context,
添加log打印关键日志

end

golang封装mysql涉及到的包以及sqlx和gorm的区别相关推荐

  1. 封装一个自己的golang操作MySQL数据库工具

    封装一个自己的golang操作MySQL数据库工具 准备工作 导入驱动 连接mysql 增删改查 增 删 改 查 准备工作 首先我们要准备一个写golang的IDE,我用的是goland,还可以用vs ...

  2. 基于Golang的对象序列化的程序包开发——myJsonMarshal

    基于Golang的对象序列化的程序包开发--myJsonMarshal[阅读时间:约10分钟] 一.对象序列化概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.具体程序设计及 ...

  3. mysql操作数据库的步骤,Golang操作MySql数据库的完整步骤记录

    前言 MySQL是业界常用的关系型数据库,在平时开发中会经常与MySql数据库打交道,所以在接下来将介绍怎么使用Go语言操作MySql数据库. 下载MySql连接驱动 Go语言中的database/s ...

  4. golang连接mysql操作示例增删改查

    golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动.这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/ ...

  5. Golang 调用MySQL存储过程

    原创:转载请标明出处: https://blog.csdn.net/ming2316780/article/details/86499344 本文出自:[iGoogle.ink的博客] Golang ...

  6. golang办公工作流workflow js-ojus/flow包介绍——系列一

    golang语言的办公工作流的包介绍--系列一 golang办公工作流workflow利用js-ojus/flow做测试--系列二 golang办公流程引擎初体验js-ojus/flow--系列三 g ...

  7. golang中mysql建立连接超时时间timeout 测试

    本文测试连接mysql的超时时间. 这里的"连接"是建立连接的意思. 连接mysql的超时时间是通过参数timeout设置的. 1.建立连接超时测试 下面例子中,设置连接超时时间为 ...

  8. 【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)

    目录[阅读时间:约5分钟] 一.概述 1.Json的作用 2.Go官方 encoding/json 包 3. golang json的主要操作 二.Json Marshal:将数据编码成json字符串 ...

  9. golang操作mysql用例

    ❤️强烈推荐人工智能学习网站❤️ golang操作mysql的demo,直接上代码 package mainimport ("database/sql""fmt" ...

最新文章

  1. 《程序设计解题策略》——1.6 利用左偏树实现优先队列的合并
  2. 实用的4W、5V直流开关稳压电源电路图及解析
  3. Mac系统Eclipse配置Maven
  4. python list遍历删除_Python中list循环遍历删除数据的正确方法
  5. linux 配置path
  6. [react] 如何解决引用类型在pureComponent下修改值的时候,页面不渲染的问题?
  7. 计算机的硬件性能指标(图片部分资源摘自王道考研资料)
  8. php 什么情况下加异常,PHP中的异常
  9. 海外召回1700辆,奔驰首款电动汽车要在中国上市了
  10. linux+ tomcat 遇到ClientAbortException: java.net.SocketException: Broken pipe
  11. 4. JavaScript Debug Tips
  12. 关于开源软件的十个问题(下篇)
  13. JavaSE环境搭建
  14. 图像直方图及其均衡化--opencv
  15. 解决Monterey12系统CleanMyMac X闪退问题
  16. 漫谈微信libco协程设计及实现(万字长文)
  17. ?php get_sidebar(); ?,常用函数-get_sidebar()
  18. 100天精通Python(基础篇)——第8天:名片管理系统
  19. 生活中不可缺少的日常小知识(转载)
  20. esp8266 micropython mqtt_ESP8266 使用 micropython 编程ntp数显tm1637 mqtt 上传 温湿度 气压到Domoticz 集中......

热门文章

  1. 8.3 机器人平台设计之arduino与电机驱动
  2. 隐藏输入法图标的方法
  3. 大疆社招测开面经(一年经验,已通过)
  4. 眼动数据分析基础_02
  5. 蓝桥杯练习系统之基础训练Java版(2-26)—— 报时助手
  6. 请简述计算机安全的定义 现,2012年12月考试计算机基础第三次作业.doc
  7. 写个脚本批量注册网站账号
  8. (5)多体量子态与统计力学基础
  9. XXL-Job启动源码详解
  10. 台式电子计算机内部电源的电压,电源知识:台式电脑电源中的+12V/+5V/+3.3V都为哪些硬件供电?(2)...