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(&id, &name)</code>
<code>}</code>
prepare傳回stmt結構
exec傳回result結構
至于這幾個結構也有各自的方法。