本文執行個體講述了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語言程式設計有所協助。