天天看點

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結構

至于這幾個結構也有各自的方法。