go語(yǔ)言的sql包原理與用法分析
本文實(shí)例講述了go語(yǔ)言的sql包原理與用法。分享給大家供大家參考,具體如下:
go的sql包是在pkg/database中,里面的兩個(gè)包sql和sql/driver可以一起看。建議看這個(gè)兩個(gè)包之前可以先看看sql文件夾下的doc.txt。這個(gè)文檔說(shuō)了幾點(diǎn)比較重要的:
1 這兩個(gè)包是真正Go風(fēng)格的包。
2 這使用這兩個(gè)包就不需要關(guān)于并發(fā)處理了,也不需要維護(hù)自己的數(shù)據(jù)庫(kù)連接池了,一旦建立了一個(gè)連接,這個(gè)連接是可以在各個(gè)goroutine之間共用的。
3 sql/driver提供的是數(shù)據(jù)庫(kù)的接口,具體的實(shí)現(xiàn)還需要自己實(shí)現(xiàn)。
先看database/driver包
第一個(gè)用到的方法是Register
這個(gè)方法將實(shí)現(xiàn)了driver.Driver的驅(qū)動(dòng)注冊(cè)到變量drivers中,當(dāng)寫(xiě)完一個(gè)驅(qū)動(dòng)之后,就需要將驅(qū)動(dòng)注冊(cè)到sql中才能使用sql包中的這些接口。這個(gè)實(shí)現(xiàn)了driver.Driver的必須實(shí)現(xiàn)了Open方法.
driver.Open返回的是driver.Conn,它的三個(gè)方法
Prepare : 參數(shù)綁定
Close : 關(guān)閉連接
Begin : 支持事務(wù)
先看Prepare,這個(gè)和php mysql pdo一樣的用法
Conn.Prepare("select * from test where a=?")
返回的Stmt結(jié)構(gòu):
Close : 關(guān)閉這個(gè)statement
NumInput : 返回有多少個(gè)可以綁定的參數(shù)
Exec : Insert或者update等無(wú)返回的使用
Query :select等查詢操作使用
Exec是綁定變量,然后返回Result結(jié)構(gòu)
Query是綁定變量,然后返回Rows結(jié)果集
看Result里面的方法:
LastInsertId() : Insert操作之后獲取到的主鍵id
RowsAffect() : 影響到的行數(shù)
Rows:
Columns() : 返回的數(shù)據(jù)有哪些列,其實(shí)就是返回的表列名
Close() : 關(guān)閉Rows,調(diào)用之后不能再進(jìn)行任何操作
Next() : 將下一行的數(shù)據(jù)取到des[] Value中。這里的Value接口可以是int64,float64,bool,[]byte,string,time.Time
下面回到Begin,返回了Tx
開(kāi)始事務(wù)之后除了查詢之外,就兩種行為:Commit和Rollback,這兩種行為都是Tx接口的方法
drvier中的結(jié)構(gòu)全是接口性質(zhì)的,它需要你來(lái)實(shí)現(xiàn)并注冊(cè)到Register中。
驅(qū)動(dòng)的具體使用是在database/sql中
首先將幾個(gè)sql的結(jié)構(gòu)看一遍
首先sql中的結(jié)構(gòu)都是對(duì)driver中的結(jié)構(gòu)進(jìn)行了一層封裝,比如像Rows,有個(gè)內(nèi)部屬性是rowsi driver.Rows。
對(duì)sql的實(shí)際操作都是使用driver.Rows里面的接口進(jìn)行操作的,實(shí)際也就是使用你自己實(shí)現(xiàn)的driver進(jìn)行操作。
driver和sql就像插頭和一個(gè)充滿插頭的汽車一樣,你實(shí)現(xiàn)了driver,即實(shí)現(xiàn)了這些插頭的配置,你就可使用sql這個(gè)汽車了。
Result : 和driver中的Result一致,即你如果實(shí)現(xiàn)了driver.Result,那你自然就實(shí)現(xiàn)了sql.Result。它是個(gè)接口,其實(shí)沒(méi)有什么特殊的用處,如果sql包中的所有Result都換成driver.Result也是行的,估計(jì)是作者希望返回值不要引用到其他包去,就使用這種方法。
Rows : 基于了driver.Rows, 還在上面擴(kuò)展了幾個(gè)其他的方法。擁有方法:
Close
Cloumns
Err
Next
Scan
Stmt :基于driver.Stmt。擁有方法
Close
Exec
Query
QueryRow
Tx:基于driver.Tx。擁有方法:
Commit
Exec
Prepare
Query
QueryRow
Rollback
Stmt
從sql.Open開(kāi)始
返回了sql.DB結(jié)構(gòu),這個(gè)結(jié)構(gòu)是實(shí)現(xiàn)了driver.Conn結(jié)構(gòu),除了Conn已有的Prepare,Begin,Close之外,還直接多了幾個(gè)查詢方法:
Driver() : 返回當(dāng)前驅(qū)動(dòng)
Exec() : 直接進(jìn)行操作
Query() : 進(jìn)行查詢,返回Rows
QueryRow() : 預(yù)期返回單行,返回Row
不管Rows還是Row都有個(gè)很好用的方法Scan來(lái)將數(shù)據(jù)放到制定的變量中去。
比如下面就是典型的Rows用法
...
for rows.Next() {
var id int
var name string
err = rows.Scan(&id, &name)
...
}
Prepare返回Stmt結(jié)構(gòu)
Exec返回Result結(jié)構(gòu)
至于這幾個(gè)結(jié)構(gòu)也有各自的方法。
希望本文所述對(duì)大家Go語(yǔ)言程序設(shè)計(jì)有所幫助。
- go語(yǔ)言通過(guò)odbc訪問(wèn)Sql Server數(shù)據(jù)庫(kù)的方法
- Go語(yǔ)言使用MySql的方法
- Go語(yǔ)言操作mysql數(shù)據(jù)庫(kù)簡(jiǎn)單例子
- 在Go語(yǔ)言程序中使用gojson來(lái)解析JSON格式文件
- go語(yǔ)言讀取json并下載高清妹子圖片
- Go語(yǔ)言對(duì)JSON進(jìn)行編碼和解碼的方法
- Go語(yǔ)言中轉(zhuǎn)換JSON數(shù)據(jù)簡(jiǎn)單例子
- go語(yǔ)言通過(guò)odbc操作Access數(shù)據(jù)庫(kù)的方法
- golang實(shí)現(xiàn)sql結(jié)果集以json格式輸出的方法
相關(guān)文章
使用Go語(yǔ)言開(kāi)發(fā)短鏈接服務(wù)的方法
短鏈接一般是通過(guò)映射關(guān)系,將長(zhǎng)長(zhǎng)的一串網(wǎng)址,映射到幾個(gè)字符的短鏈接上,建立好這種映射關(guān)系之后保存到數(shù)據(jù)庫(kù)里,用戶每次訪問(wèn)短鏈接的時(shí)候,這篇文章主要介紹了使用Go語(yǔ)言開(kāi)發(fā)一個(gè)短鏈接服務(wù),需要的朋友可以參考下2024-03-03
Go語(yǔ)言實(shí)現(xiàn)UDP協(xié)議及TCP通訊
這篇文章介紹了Go語(yǔ)言實(shí)現(xiàn)UDP協(xié)議及TCP通訊的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
簡(jiǎn)單聊聊Golang中defer預(yù)計(jì)算參數(shù)
在golang當(dāng)中defer代碼塊會(huì)在函數(shù)調(diào)用鏈表中增加一個(gè)函數(shù)調(diào)用,下面這篇文章主要給大家介紹了關(guān)于Golang中defer預(yù)計(jì)算參數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
使用golang生成prometheus格式數(shù)據(jù)
Prometheus是一個(gè)開(kāi)源的監(jiān)控系統(tǒng),擁有許多Advanced?Feature,本文將介紹Primetheus?client的使用,并基于golang生成prometheus格式數(shù)據(jù),希望對(duì)大家有所幫助2025-02-02
go的websocket實(shí)現(xiàn)原理與用法詳解
這篇文章主要介紹了go的websocket實(shí)現(xiàn)原理與用法,詳細(xì)分析了websocket的功能、原理及Go語(yǔ)言實(shí)現(xiàn)websocket的相關(guān)技巧,需要的朋友可以參考下2016-07-07
go語(yǔ)言實(shí)現(xiàn)Elasticsearches批量修改查詢及發(fā)送MQ操作示例
這篇文章主要為大家介紹了go語(yǔ)言實(shí)現(xiàn)Elasticsearches批量修改查詢及發(fā)送MQ操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
Golang中List的實(shí)現(xiàn)方法示例詳解
最近決定復(fù)習(xí)下Go,所以下面這篇文章主要給大家介紹了關(guān)于Golang中List的實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09

