go語言的sql包原理與用法分析

2022-10-03 09:33:06 字數 2482 閱讀 8585

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.除了能夠讓函式裡的變數生命週期發生改變,還有一...