当前位置: 首页 > 编程笔记 >

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

越麒
2023-03-14
本文向大家介绍go语言的sql包原理与用法分析,包括了go语言的sql包原理与用法分析的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了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语言程序设计有所帮助。

 类似资料:
  • 主要内容:为什么需要锁,互斥锁 Mutex,读写锁Go语言中 sync 包里提供了互斥锁 Mutex 和读写锁 RWMutex 用于处理并发过程中可能出现同时两个或多个协程(或线程)读或写同一个变量的情况。 为什么需要锁 锁是 sync 包中的核心,它主要有两个方法,分别是加锁(Lock)和解锁(Unlock)。 在并发的情况下,多个线程或协程同时其修改一个变量,使用锁能保证在某一时间内,只有一个协程或线程修改这一变量。 不使用锁时,在并发的情况

  • 本文向大家介绍go语言里包的用法实例,包括了go语言里包的用法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了go语言里包的用法。分享给大家供大家参考。具体分析如下: 每个 Go 程序都是由包组成的。 程序运行的入口是包 main。 这个程序使用并导入了包 "fmt" 和 "math"。 按照惯例,包名与导入路径的最后一个目录一致。 希望本文所述对大家的Go语言程序设计有所帮助。

  • 主要内容:os 包中的常用函数,os/exec 执行外部命令,os/user 获取当前用户信息,os/signal 信号处理Go语言的 os 包中提供了操作系统函数的接口,是一个比较重要的包。顾名思义,os 包的作用主要是在服务器上进行系统的基本操作,如文件操作、目录操作、执行命令、信号与中断、进程、系统状态等等。 os 包中的常用函数 1) Hostname 函数定义: func Hostname() (name string, err error) Hostname 函数会返回内核提供的主机

  • 实际开发中,对于超出 int64 或者 uint64 类型的大数进行计算时,如果对精度没有要求,使用 float32 或者 float64 就可以胜任,但如果对精度有严格要求的时候,我们就不能使用浮点数了,因为浮点数在内存中只能被近似的表示。 Go语言中 math/big 包实现了大数字的多精度计算,支持 Int(有符号整数)、Rat(有理数)和 Float(浮点数)等数字类型。 这些类型可以实现

  • 本文向大家介绍Go语言中的方法定义用法分析,包括了Go语言中的方法定义用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Go语言中的方法定义。分享给大家供大家参考。具体分析如下: 事实上,可以对包中的任意类型定义任意方法,而不仅仅是结构体。 不能对来自其他包的类型或基础类型定义方法。 希望本文所述对大家的Go语言程序设计有所帮助。

  • 本文向大家介绍Go语言中的range用法实例分析,包括了Go语言中的range用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Go语言中的range用法。分享给大家供大家参考。具体如下: for 循环的 range 格式可以对 slice 或者 map 进行迭代循环。 可以将值赋值给 _ 来忽略键名和值。 如果只需要索引值,去掉“, value”的部分即可。 希望本文所述对大家