天天看点

go的sql包先看database/driver包驱动的具体使用是在database/sql中

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

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

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

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

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

driver.open返回的是driver.conn,它的三个方法

prepare : 参数绑定

close : 关闭连接

begin : 支持事务

conn.prepare("select * from test where a=?")

返回的stmt结构:

close : 关闭这个statement

numinput : 返回有多少个可以绑定的参数

exec : insert或者update等无返回的使用

query :select等查询操作使用

exec是绑定变量,然后返回result结构

query是绑定变量,然后返回rows结果集

lastinsertid()  : insert操作之后获取到的主键id

rowsaffect() : 影响到的行数

rows:

columns() : 返回的数据有哪些列,其实就是返回的表列名

close() : 关闭rows,调用之后不能再进行任何操作

next() : 将下一行的数据取到des[] value中。这里的value接口可以是int64,float64,bool,[]byte,string,time.time

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

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

首先将几个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。拥有方法

exec

query

queryrow

tx:基于driver.tx。拥有方法:

commit

prepare

rollback

stmt

从sql.open开始

返回了sql.db结构,这个结构是实现了driver.conn结构,除了conn已有的prepare,begin,close之外,还直接多了几个查询方法:

driver() : 返回当前驱动

exec() : 直接进行操作

query() : 进行查询,返回rows

queryrow() : 预期返回单行,返回row

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<code>rows, err := db.query(</code><code>"select ..."</code><code>)</code>

<code>...</code>

<code>for</code> <code>rows.next() {</code>

<code>    </code> 

<code>var</code> <code>id int</code>

<code>var</code> <code>name string</code>

<code>err = rows.scan(&amp;id, &amp;name)</code>

<code>}</code>

prepare返回stmt结构

exec返回result结构

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