go语言的sql包原理与用法分析

go的sql包是在pkg/database中,里面的两个包sql和sql/driver可以一起看。建议看这个两个包之前可以先看看sql文件夹下的doc.txt。这个文档说了几点比较重要的:

1 这两个包是真正Go风格的包。

2 这使用这两个包就不需要关于并发处理了,也不需要维护自己的数据库连接池了,一旦建立了一个连接,这个连接是可以在各个goroutine之间共用的。

3 sql/driver提供的是数据库的接口,具体的实现还需要自己实现。

先看database/driver包

第一个用到的方法是Register

这个方法将实现了driver.Driver的驱动注册到变量drivers中,当写完一个驱动之后,就需要将驱动注册到sql中才能使用sql包中的这些接口。这个实现了driver.Driver的必须实现了Open方法.

driver.Open返回的是driver.Conn,它的三个方法

Prepare : 参数绑定 Close : 关闭连接 Begin : 支持事务

先看Prepare,这个和php mysql pdo一样的用法

Conn.Prepare("select * from test where a=?")

返回的Stmt结构:

Close : 关闭这个statement NumInput : 返回有多少个可以绑定的参数 Exec : Insert或者update等无返回的使用 Query :select等查询操作使用 Exec是绑定变量,然后返回Result结构 Query是绑定变量,然后返回Rows结果集

看Result里面的方法:

LastInsertId() : Insert操作之后获取到的主键id RowsAffect() : 影响到的行数 Rows: Columns() : 返回的数据有哪些列,其实就是返回的表列名 Close() : 关闭Rows,调用之后不能再进行任何操作 Next() : 将下一行的数据取到des[] Value中。这里的Value接口可以是int64,float64,bool,[]byte,string,time.Time

下面回到Begin,返回了Tx

开始事务之后除了查询之外,就两种行为:Commit和Rollback,这两种行为都是Tx接口的方法

drvier中的结构全是接口性质的,它需要你来实现并注册到Register中。

驱动的具体使用是在database/sql中

首先将几个sql的结构看一遍

首先sql中的结构都是对driver中的结构进行了一层封装,比如像Rows,有个内部属性是rowsi driver.Rows。

对sql的实际操作都是使用driver.Rows里面的接口进行操作的,实际也就是使用你自己实现的driver进行操作。

driver和sql就像插头和一个充满插头的汽车一样,你实现了driver,即实现了这些插头的配置,你就可使用sql这个汽车了。

Result : 和driver中的Result一致,即你如果实现了driver.Result,那你自然就实现了sql.Result。它是个接口,其实没有什么特殊的用处,如果sql包中的所有Result都换成driver.Result也是行的,估计是作者希望返回值不要引用到其他包去,就使用这种方法。

Rows : 基于了driver.Rows, 还在上面扩展了几个其他的方法。拥有方法:

Close Cloumns Err Next Scan Stmt :基于driver.Stmt。拥有方法 Close Exec Query QueryRow Tx:基于driver.Tx。拥有方法: Commit Exec Prepare Query QueryRow Rollback Stmt

从sql.Open开始

返回了sql.DB结构,这个结构是实现了driver.Conn结构,除了Conn已有的Prepare,Begin,Close之外,还直接多了几个查询方法:

Driver() : 返回当前驱动 Exec() : 直接进行操作 Query() : 进行查询,返回Rows QueryRow() : 预期返回单行,返回Row

不管Rows还是Row都有个很好用的方法Scan来将数据放到制定的变量中去。

比如下面就是典型的Rows用法

rows, err := db.Query("SELECT ...")
...
for rows.Next() {
var id int
var name string
err = rows.Scan(&id, &name)
...
}

Prepare返回Stmt结构

Exec返回Result结构

至于这几个结构也有各自的方法。

希望本文所述对大家Go语言程序设计有所帮助。

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2016-11-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏chenssy

【死磕Sharding-jdbc】---结果合并

接下来以执行 SELECT o.*FROM t_order o whereo.user_id=10order byo.order_id desc limit 2...

1133
来自专栏*坤的Blog

自写文件小工具类

1643
来自专栏农夫安全

注入学习之sqli-labs-6(第五次)

前言 上一次课讲解的是sql基于布尔型盲注,紧接着这节讲基于时间的盲注 布尔型盲注,是在我们判断网站是否存在注入的时候,网页不会暴漏错误信息,但会返回正确的页面...

3716
来自专栏后端之路

Excel导入改善

最近由于上线的需要,对于excel导入导出的效率提出了要求。 那么一方面我们对于db落库的业务尽量走批量, 其次对于导入数据的校验以及对应成实体也做出了改善。...

5537
来自专栏技术博客

Entity Framework DataAnnotations

DataAnnotation 特性由.NET 3.5中引进,给.NET中的类提供了一种添加验证的方式。但是在EF中它又可以对映射关系进行控制,相比较Fluent...

833
来自专栏xiaoheike

Hibernate save, saveOrUpdate, persist, merge, update 区别

hibernate save()方法能够保存实体到数据库,正如方法名称save这个单词所表明的意思。我们能够在事务之外调用这个方法,这也是我不喜欢使用这个方法保...

1283
来自专栏PHP在线

mysql学习笔记

InnoDB引擎与MyISAM引擎 mysql是关系型数据库。其中的存储引擎可以show engines来查看。我的版本是5.6.26的,查看版本用selec...

2845
来自专栏Golang语言社区

go语言的sql包原理与用法分析

本文实例讲述了go语言的sql包原理与用法。分享给大家供大家参考,具体如下: go的sql包是在pkg/database中,里面的两个包sql和sql/driv...

4436
来自专栏coolblog.xyz技术专栏

MyBatis 源码分析 - SQL 的执行过程

本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程。该过程本身比较复杂,牵涉到的技术点比较多。包括但不限于 Mapper 接口代理类的生成、接口方法...

4162
来自专栏跟着阿笨一起玩NET

【C#】Entity Framework 增删改查和事务操作

  方法二:方法一中每次都需要对所有字段进行修改,效率低,而且麻烦,下面介绍修改部分字段

881

扫码关注云+社区