《Go語言從入門到精通》Go語言進(jìn)行數(shù)據(jù)庫開發(fā)_第1頁
《Go語言從入門到精通》Go語言進(jìn)行數(shù)據(jù)庫開發(fā)_第2頁
《Go語言從入門到精通》Go語言進(jìn)行數(shù)據(jù)庫開發(fā)_第3頁
《Go語言從入門到精通》Go語言進(jìn)行數(shù)據(jù)庫開發(fā)_第4頁
《Go語言從入門到精通》Go語言進(jìn)行數(shù)據(jù)庫開發(fā)_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Go語言進(jìn)行數(shù)據(jù)庫開發(fā)Go語言從入門到精通掌握Go語言數(shù)據(jù)庫開發(fā)的基本方法了解NoSQL數(shù)據(jù)庫的基礎(chǔ)開發(fā)01DATABASE02SQL03NoSQLtarget目標(biāo)掌握SQL數(shù)據(jù)庫的常用操作目錄導(dǎo)航12.1Go語言進(jìn)行數(shù)據(jù)庫開發(fā)的一般方式ContentsGo語言支持傳統(tǒng)SQL數(shù)據(jù)庫的方式Go語言標(biāo)準(zhǔn)庫中并不“直接”支持任何傳統(tǒng)數(shù)據(jù)庫的開發(fā)通過database/sql包提供了一個標(biāo)準(zhǔn)的SQL類型數(shù)據(jù)庫的接口

任何第三方包只要按要求實現(xiàn)了該接口,都可以按統(tǒng)一的方式來使用進(jìn)行數(shù)據(jù)庫訪問和操作目前的主流數(shù)據(jù)庫基本都有可用的第三方包Go語言SQL數(shù)據(jù)庫支持的優(yōu)點開發(fā)人員可以只維護(hù)一套代碼僅需更換數(shù)據(jù)庫驅(qū)動(即相應(yīng)的第三方Go語言包)即可實現(xiàn)更換數(shù)據(jù)庫目錄導(dǎo)航12.2安裝SQLite數(shù)據(jù)庫驅(qū)動Contents支持SQLite數(shù)據(jù)庫的第三方包goget-v/mattn/go-sqlite3

僅在程序開發(fā)(編譯)時需要該包,發(fā)布可執(zhí)行程序時,用戶電腦上無需安裝任何驅(qū)動支持SQLite數(shù)據(jù)庫的第三方包goget-v/mattn/go-sqlite3

僅在程序開發(fā)(編譯)時需要該包,發(fā)布可執(zhí)行程序時,用戶電腦上無需安裝任何驅(qū)動

由于Go語言SQL數(shù)據(jù)庫訪問的標(biāo)準(zhǔn)型,以SQLite為例,其他數(shù)據(jù)庫也是類似的訪問方式,一般僅需調(diào)整數(shù)據(jù)庫連接配置即可目錄導(dǎo)航12.3基本的數(shù)據(jù)庫操作-新建庫表、插入記錄和查詢Contents引用標(biāo)準(zhǔn)SQL包和SQLite數(shù)據(jù)庫包package

main

import

(

"os"

t

"tools"

"database/sql"

_

"/mattn/go-sqlite3")下劃線引用表示執(zhí)行該包中的所有init函數(shù),但不會使用其中的其他內(nèi)容創(chuàng)建新SQLite數(shù)據(jù)庫//

如果存在該庫(SQLite庫是放在單一的文件中的)則刪除該文件if

t.FileExists(`c:\test\test.db`)

{

os.Remove(`c:\test\test.db`)}

//

創(chuàng)建新庫dbT,

errT

:=

sql.Open("sqlite3",

`c:\test\test.db`)

if

errT

!=

nil

{

t.Printfln("創(chuàng)建數(shù)據(jù)庫時發(fā)生錯誤:%v",

errT.Error())

return}

defer

dbT.Close()SQLite數(shù)據(jù)庫是基于文件的輕量級關(guān)系型數(shù)據(jù)庫向庫中新增(插入)記錄//

開始一個數(shù)據(jù)庫事務(wù)txT,

errT

:=

dbT.Begin()if

errT

!=

nil

{

t.Printfln("新建事務(wù)時發(fā)生錯誤:%v",

errT.Error())

return}

//

準(zhǔn)備一個SQL語句,用于向表中插入記錄stmtT,

errT

:=

txT.Prepare("insert

into

TEST(ID,

CODE)

values(?,

?)")if

errT

!=

nil

{

t.Printfln("準(zhǔn)備SQL語句插入記錄時發(fā)生錯誤:%v",

errT.Error())

return}defer

stmtT.Close()

//

向表中插入10條記錄,每條記錄的ID字段用循環(huán)變量的值賦值for

i

:=

0;

i

<

10;

i++

{

_,

errT

=

stmtT.Exec(i,

t.GenerateRandomString(5,

8,

true,

true,

true,

false,

false,

false))

if

errT

!=

nil

{

t.Printfln("執(zhí)行SQL插入記錄語句時發(fā)生錯誤:%v",

errT.Error())

return

}}

txT.Commit()//

執(zhí)行事務(wù),此時新紀(jì)錄才會被真正插入到表中查詢數(shù)據(jù)庫rowsT,

errT

:=

dbT.Query("select

ID,

CODE

from

TEST")if

errT

!=

nil

{

t.Printfln("執(zhí)行SQL查詢語句時發(fā)生錯誤:%v",

errT.Error())

return}defer

rowsT.Close()for

rowsT.Next()

{//

遍歷查詢結(jié)果

var

idT

int

var

codeT

string

errT

=

rowsT.Scan(&idT,

&codeT)

if

errT

!=

nil

{

t.Printfln("遍歷查詢結(jié)果時發(fā)生錯誤:%v",

errT.Error())

return

}

t.Printfln("ID:

%v,

CODE:

%v",

idT,

codeT)}

//

檢查查詢結(jié)果的錯誤errT

=

rowsT.Err()if

errT

!=

nil

{

t.Printfln("查詢結(jié)果有錯誤:%v",

errT.Error())}目錄導(dǎo)航12.4刪除記錄、準(zhǔn)備SQL查詢等操作Contents“準(zhǔn)備”查詢數(shù)據(jù)庫的SQL語句stmtT,

errT

:=

dbT.Prepare("select

CODE

from

TEST

where

ID

=

?")if

errT

!=

nil

{

t.Printfln("準(zhǔn)備SQL查詢語句時發(fā)生錯誤:%v",

errT.Error())

return}

defer

stmtT.Close()

var

codeT

string

errT

=

stmtT.QueryRow("5").Scan(&codeT)

if

errT

!=

nil

{

t.Printfln("從查詢結(jié)果中獲取字段數(shù)值時發(fā)生錯誤:%v",

errT.Error())

return}

t.Printfln("第5條記錄中的CODE字段值為:%v",

codeT)送入前面用?號聲明的參數(shù)刪除數(shù)據(jù)庫記錄//

刪除TEST表中所有記錄_,

errT

=

dbT.Exec("delete

from

TEST")if

errT

!=

nil

{

t.Printfln("刪除數(shù)據(jù)庫表記錄時發(fā)生錯誤:%v",

errT.Error())

return}//

刪除TEST表中符合條件的記錄_,

errT

=

dbT.Exec("delete

from

TESTwhereID<3")if

errT

!=

nil

{

t.Printfln("刪除數(shù)據(jù)庫表記錄時發(fā)生錯誤:%v",

errT.Error())

return}目錄導(dǎo)航12.5獲取記錄條數(shù)、刪表等操作Contents查詢數(shù)據(jù)庫記錄條數(shù)//

查詢表中所有符合條件的記錄總數(shù)

var

countT

int64

errT

=

dbT.QueryRow("select

count(*)

from

TEST").Scan(&countT)if

errT

!=

nil

{

t.Printfln("執(zhí)行SQL查詢語句時發(fā)生錯誤:%v",

errT.Error())

return}

t.Printfln("庫表中共有%v條記錄",

countT)刪除數(shù)據(jù)庫表查詢數(shù)據(jù)庫記錄條數(shù)//

刪除庫表

_,

errT

=

dbT.Exec(`drop

table

TEST`)if

errT

!=

nil

{

t.Printfln("刪除庫表時發(fā)生錯誤:%v",

errT.Error())

return}目錄導(dǎo)航12.6SQL型數(shù)據(jù)庫開發(fā)總結(jié)Contents語法嚴(yán)格的益處Go語言SQL型數(shù)據(jù)庫的開發(fā)基本是類似的一般數(shù)據(jù)庫連接類型和連接字串稍作改動即可(例:Oracle數(shù)據(jù)庫第三方包為/godror/godror,連接類型為“godror”,連接字串為`user/password@:1521/dbname`)偶爾一些數(shù)據(jù)庫特有的SQL語法稍作相應(yīng)改動目錄導(dǎo)航12.7NoSQL型數(shù)據(jù)庫開發(fā)示例ContentsNoSQL數(shù)據(jù)庫

NoSQL是“nonSQL”的簡稱(也有說是“NotonlySQL”即“不僅僅是SQL”的),由于SQL語言是關(guān)系型數(shù)據(jù)庫使用的主要語言,因此NoSQL指的是不使用關(guān)系型數(shù)據(jù)庫的新數(shù)據(jù)庫技術(shù)摒棄了傳統(tǒng)關(guān)系型數(shù)據(jù)庫中用二維表來表達(dá)數(shù)據(jù)的形式主要支持的是以鍵值對(Key-ValuePair)為主的數(shù)據(jù)存儲方式,也支持圖像、文檔、數(shù)據(jù)對象等的存儲創(chuàng)建NoSQL數(shù)據(jù)庫import

(

//

應(yīng)用所需的包

"/dgraph-io/badger")……//

準(zhǔn)備創(chuàng)建數(shù)據(jù)庫的設(shè)置參數(shù)optionsT

:=

badger.DefaultOptions

//

設(shè)置數(shù)據(jù)庫的工作目錄optionsT.Dir

=

`c:\test\db`optionsT.ValueDir

=

`c:\test\db`

//

創(chuàng)建或打開數(shù)據(jù)庫dbT,

errT

:=

badger.Open(optionsT)if

errT

!=

nil

{

log.Fatal(errT)}

//

確保退出前關(guān)閉數(shù)據(jù)庫defer

dbT.Close()向NoSQL數(shù)據(jù)庫中寫入數(shù)據(jù)//

準(zhǔn)備用于測試的數(shù)據(jù),是映射類型的數(shù)據(jù)dataT

:=

make(map[string]string)

dataT["ok"]

=

"yes"dataT["名字"]

=

"張三"

//

新建一個事務(wù)transT

:=

dbT.NewTransaction(true)

//

遍歷測試數(shù)據(jù)并存入數(shù)據(jù)庫for

k,

v

:=

range

dataT

{

//

將對應(yīng)的鍵值對存入

errT

:=

transT.Set([]byte(k),

[]byte(v))

if

errT

!=

nil

{

fmt.Printf("設(shè)置KV對時發(fā)生錯誤:%v",

errT.Error())

}

}

//

提交事務(wù),此時才真正寫入數(shù)據(jù)庫_

=

transT.Commit()按鍵名查詢NoSQL數(shù)據(jù)庫中的鍵值//

再次新建一個事務(wù)用于查詢transT

=

dbT.NewTransaction(true)

//

查詢鍵名為ok對應(yīng)的鍵值itemT,

errT

:=

transT.Get([]byte("ok"))

if

errT

!=

nil

{

log.Fatalf("獲取KV對時發(fā)生錯誤:%v",

errT)}

//

獲取鍵值valueT,

errT

:=

itemT.ValueCopy(nil)

if

errT

!=

nil

{

log.Fatalf("獲取KV對值時發(fā)生錯誤:%v",

errT)}

fmt.Printf("獲取到的鍵名為%v的鍵值:%v\n",

"ok",

string(valueT))遍歷NoSQL數(shù)據(jù)庫中的所有鍵值對errT

=

dbT.View(func(txn

*badger.Txn)

error

{//

用只讀模式打開數(shù)據(jù)庫

optionsT

:=

badger.DefaultIteratorOptions

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論