最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年07月26日 17:00:50   作者:軒脈刃  
這篇文章主要介紹了go語言的sql包原理與用法,較為詳細(xì)的分析了Go語言里sql包的結(jié)構(gòu)、相關(guān)函數(shù)與使用方法,需要的朋友可以參考下

本文實例講述了go語言的sql包原理與用法。分享給大家供大家參考,具體如下:

go的sql包是在pkg/database中,里面的兩個包sql和sql/driver可以一起看。建議看這個兩個包之前可以先看看sql文件夾下的doc.txt。這個文檔說了幾點比較重要的:

1 這兩個包是真正Go風(fēng)格的包。

2 這使用這兩個包就不需要關(guān)于并發(fā)處理了,也不需要維護(hù)自己的數(shù)據(jù)庫連接池了,一旦建立了一個連接,這個連接是可以在各個goroutine之間共用的。

3 sql/driver提供的是數(shù)據(jù)庫的接口,具體的實現(xiàn)還需要自己實現(xiàn)。

先看database/driver包

第一個用到的方法是Register

這個方法將實現(xiàn)了driver.Driver的驅(qū)動注冊到變量drivers中,當(dāng)寫完一個驅(qū)動之后,就需要將驅(qū)動注冊到sql中才能使用sql包中的這些接口。這個實現(xiàn)了driver.Driver的必須實現(xiàn)了Open方法.

driver.Open返回的是driver.Conn,它的三個方法

Prepare : 參數(shù)綁定
Close : 關(guān)閉連接
Begin : 支持事務(wù)

先看Prepare,這個和php mysql pdo一樣的用法

Conn.Prepare("select * from test where a=?")

返回的Stmt結(jié)構(gòu):

Close : 關(guān)閉這個statement
NumInput : 返回有多少個可以綁定的參數(shù)
Exec : Insert或者update等無返回的使用
Query :select等查詢操作使用
Exec是綁定變量,然后返回Result結(jié)構(gòu)
Query是綁定變量,然后返回Rows結(jié)果集

看Result里面的方法:

LastInsertId()  : Insert操作之后獲取到的主鍵id
RowsAffect() : 影響到的行數(shù)
Rows:
Columns() : 返回的數(shù)據(jù)有哪些列,其實就是返回的表列名
Close() : 關(guān)閉Rows,調(diào)用之后不能再進(jìn)行任何操作
Next() : 將下一行的數(shù)據(jù)取到des[] Value中。這里的Value接口可以是int64,float64,bool,[]byte,string,time.Time

下面回到Begin,返回了Tx

開始事務(wù)之后除了查詢之外,就兩種行為:Commit和Rollback,這兩種行為都是Tx接口的方法

drvier中的結(jié)構(gòu)全是接口性質(zhì)的,它需要你來實現(xiàn)并注冊到Register中。

驅(qū)動的具體使用是在database/sql中

首先將幾個sql的結(jié)構(gòu)看一遍

首先sql中的結(jié)構(gòu)都是對driver中的結(jié)構(gòu)進(jìn)行了一層封裝,比如像Rows,有個內(nèi)部屬性是rowsi driver.Rows。

對sql的實際操作都是使用driver.Rows里面的接口進(jìn)行操作的,實際也就是使用你自己實現(xiàn)的driver進(jìn)行操作。

driver和sql就像插頭和一個充滿插頭的汽車一樣,你實現(xiàn)了driver,即實現(xiàn)了這些插頭的配置,你就可使用sql這個汽車了。

Result : 和driver中的Result一致,即你如果實現(xiàn)了driver.Result,那你自然就實現(xiàn)了sql.Result。它是個接口,其實沒有什么特殊的用處,如果sql包中的所有Result都換成driver.Result也是行的,估計是作者希望返回值不要引用到其他包去,就使用這種方法。

Rows :  基于了driver.Rows, 還在上面擴(kuò)展了幾個其他的方法。擁有方法:

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結(jié)構(gòu),這個結(jié)構(gòu)是實現(xiàn)了driver.Conn結(jié)構(gòu),除了Conn已有的Prepare,Begin,Close之外,還直接多了幾個查詢方法:

Driver() : 返回當(dāng)前驅(qū)動
Exec() : 直接進(jìn)行操作
Query() : 進(jìn)行查詢,返回Rows
QueryRow() : 預(yù)期返回單行,返回Row

不管Rows還是Row都有個很好用的方法Scan來將數(shù)據(jù)放到制定的變量中去。

比如下面就是典型的Rows用法

復(fù)制代碼 代碼如下:
rows, err := db.Query("SELECT ...")
...
for rows.Next() {
var id int
var name string
err = rows.Scan(&id, &name)
...
}

Prepare返回Stmt結(jié)構(gòu)

Exec返回Result結(jié)構(gòu)

至于這幾個結(jié)構(gòu)也有各自的方法。

希望本文所述對大家Go語言程序設(shè)計有所幫助。

相關(guān)文章

  • 使用Go語言開發(fā)短鏈接服務(wù)的方法

    使用Go語言開發(fā)短鏈接服務(wù)的方法

    短鏈接一般是通過映射關(guān)系,將長長的一串網(wǎng)址,映射到幾個字符的短鏈接上,建立好這種映射關(guān)系之后保存到數(shù)據(jù)庫里,用戶每次訪問短鏈接的時候,這篇文章主要介紹了使用Go語言開發(fā)一個短鏈接服務(wù),需要的朋友可以參考下
    2024-03-03
  • Go語言實現(xiàn)UDP協(xié)議及TCP通訊

    Go語言實現(xiàn)UDP協(xié)議及TCP通訊

    這篇文章介紹了Go語言實現(xiàn)UDP協(xié)議及TCP通訊的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 簡單聊聊Golang中defer預(yù)計算參數(shù)

    簡單聊聊Golang中defer預(yù)計算參數(shù)

    在golang當(dāng)中defer代碼塊會在函數(shù)調(diào)用鏈表中增加一個函數(shù)調(diào)用,下面這篇文章主要給大家介紹了關(guān)于Golang中defer預(yù)計算參數(shù)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • 使用golang生成prometheus格式數(shù)據(jù)

    使用golang生成prometheus格式數(shù)據(jù)

    Prometheus是一個開源的監(jiān)控系統(tǒng),擁有許多Advanced?Feature,本文將介紹Primetheus?client的使用,并基于golang生成prometheus格式數(shù)據(jù),希望對大家有所幫助
    2025-02-02
  • 一文搞懂Golang中iota的用法和原理

    一文搞懂Golang中iota的用法和原理

    我們知道iota是go語言的常量計數(shù)器,本文嘗試全面總結(jié)其使用用法以及其實現(xiàn)原理,需要的朋友可以參考以下內(nèi)容,希望對大家有所幫助
    2022-08-08
  • 深入了解Go語言中的作用域和變量重聲明

    深入了解Go語言中的作用域和變量重聲明

    在?Go?語言中,代碼塊的嵌套和作用域是程序設(shè)計的關(guān)鍵概念之一,本文將探討如何在?Go?語言中利用代碼塊的嵌套和作用域來組織代碼,并介紹變量重聲明的規(guī)則,感興趣的可以了解下
    2023-11-11
  • go的websocket實現(xiàn)原理與用法詳解

    go的websocket實現(xiàn)原理與用法詳解

    這篇文章主要介紹了go的websocket實現(xiàn)原理與用法,詳細(xì)分析了websocket的功能、原理及Go語言實現(xiàn)websocket的相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • go語言實現(xiàn)Elasticsearches批量修改查詢及發(fā)送MQ操作示例

    go語言實現(xiàn)Elasticsearches批量修改查詢及發(fā)送MQ操作示例

    這篇文章主要為大家介紹了go語言實現(xiàn)Elasticsearches批量修改查詢及發(fā)送MQ操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • Go語言反射獲取類型屬性和方法示例

    Go語言反射獲取類型屬性和方法示例

    這篇文章主要為大家介紹了本文將介紹?Go?反射?reflect.StructField?和?reflect.Method?相關(guān)的內(nèi)容,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Golang中List的實現(xiàn)方法示例詳解

    Golang中List的實現(xiàn)方法示例詳解

    最近決定復(fù)習(xí)下Go,所以下面這篇文章主要給大家介紹了關(guān)于Golang中List的實現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09

最新評論

都匀市| 扶沟县| 治多县| 连云港市| 蓬溪县| 涞水县| 巫溪县| 商都县| 元谋县| 姚安县| 卢氏县| 鄂托克前旗| 衡东县| 苍山县| 秭归县| 岳阳县| 谷城县| 保靖县| 永吉县| 华坪县| 东乡县| 平湖市| 松桃| 林西县| 嘉义市| 宁明县| 蓝田县| 南开区| 长子县| 临夏县| 昌黎县| 唐海县| 莲花县| 辽中县| 开封市| 东至县| 淄博市| 万山特区| 屏东县| 靖州| 尼玛县|