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或者updepqtuate等無返回的使用
query :select等查詢操作使用
exec是繫結變數,然後返epqtu回result結構
query是繫結變數,然後返回rows結果集
看result裡面的方法:
lastinsertid() : insert操作之後獲取到的主鍵id
rowsaffect() : 影響到的行數
rows:
columns() : 返回的資料有哪些列,其實就是返回的表列名
close() : 關閉row程式設計客棧s,呼叫之後不能再進行任何操作
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
errnext
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()
prepare返回stmt結構
exec返回result結構
至於這幾個結構也有各自的方法。
本文標題: go語言的sql包原理與用法分析
本文位址: /jiaoben/golang/158151.html
Go 語言中 Unsafe 包的用法
後端早讀課翻譯計畫 第三篇 翻譯自 a journey with go 本文列舉在 golang 中 unsafe 的一般用法,以及提供給開發者的一些建議。本文基於 go 1.12 版本。這個 package 的名字其實已經告訴了我們,我們不應該用它。為了弄清楚為什麼用它會導致不安全,我們先看下文件...
Go語言time包用法總結
在go語言中時間型別不是關鍵字而是使用time包下time結構體 time 包提供了時間的顯示和計量用的功能。日曆的計算採用的是公曆 時間型別預設顯示為utc,所以經常需要把時間型別轉換為字串,顯示成我們所熟悉的格式 代表乙個地區,並表示該地區所在的時區 可能多個 location通常代表地理位置的...
閉包與比較器(go語言)
寫在前面的話 二者沒有什麼關係哈,只是剛好遇到了寫兩篇又費事 閉包有什麼用?1.函式裡變數的作用域是在函式執行完就 game over 的,那如何讓乙個函式的變數可以被儲存住呢?你可以使用全域性變數,但是這存在所謂的 汙染 也就是 不優美了,hhh 2.除了能夠讓函式裡的變數生命週期發生改變,還有一...