版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Go語言進(jìn)行數(shù)據(jù)庫(kù)開發(fā)Go語言從入門到精通掌握Go語言數(shù)據(jù)庫(kù)開發(fā)的基本方法了解NoSQL數(shù)據(jù)庫(kù)的基礎(chǔ)開發(fā)01DATABASE02SQL03NoSQLtarget目標(biāo)掌握SQL數(shù)據(jù)庫(kù)的常用操作目錄導(dǎo)航12.1Go語言進(jìn)行數(shù)據(jù)庫(kù)開發(fā)的一般方式ContentsGo語言支持傳統(tǒng)SQL數(shù)據(jù)庫(kù)的方式Go語言標(biāo)準(zhǔn)庫(kù)中并不“直接”支持任何傳統(tǒng)數(shù)據(jù)庫(kù)的開發(fā)通過database/sql包提供了一個(gè)標(biāo)準(zhǔn)的SQL類型數(shù)據(jù)庫(kù)的接口
任何第三方包只要按要求實(shí)現(xiàn)了該接口,都可以按統(tǒng)一的方式來使用進(jìn)行數(shù)據(jù)庫(kù)訪問和操作目前的主流數(shù)據(jù)庫(kù)基本都有可用的第三方包Go語言SQL數(shù)據(jù)庫(kù)支持的優(yōu)點(diǎn)開發(fā)人員可以只維護(hù)一套代碼僅需更換數(shù)據(jù)庫(kù)驅(qū)動(dòng)(即相應(yīng)的第三方Go語言包)即可實(shí)現(xiàn)更換數(shù)據(jù)庫(kù)目錄導(dǎo)航12.2安裝SQLite數(shù)據(jù)庫(kù)驅(qū)動(dòng)Contents支持SQLite數(shù)據(jù)庫(kù)的第三方包goget-v/mattn/go-sqlite3
僅在程序開發(fā)(編譯)時(shí)需要該包,發(fā)布可執(zhí)行程序時(shí),用戶電腦上無需安裝任何驅(qū)動(dòng)支持SQLite數(shù)據(jù)庫(kù)的第三方包goget-v/mattn/go-sqlite3
僅在程序開發(fā)(編譯)時(shí)需要該包,發(fā)布可執(zhí)行程序時(shí),用戶電腦上無需安裝任何驅(qū)動(dòng)
由于Go語言SQL數(shù)據(jù)庫(kù)訪問的標(biāo)準(zhǔn)型,以SQLite為例,其他數(shù)據(jù)庫(kù)也是類似的訪問方式,一般僅需調(diào)整數(shù)據(jù)庫(kù)連接配置即可目錄導(dǎo)航12.3基本的數(shù)據(jù)庫(kù)操作-新建庫(kù)表、插入記錄和查詢Contents引用標(biāo)準(zhǔn)SQL包和SQLite數(shù)據(jù)庫(kù)包package
main
import
(
"os"
t
"tools"
"database/sql"
_
"/mattn/go-sqlite3")下劃線引用表示執(zhí)行該包中的所有init函數(shù),但不會(huì)使用其中的其他內(nèi)容創(chuàng)建新SQLite數(shù)據(jù)庫(kù)//
如果存在該庫(kù)(SQLite庫(kù)是放在單一的文件中的)則刪除該文件if
t.FileExists(`c:\test\test.db`)
{
os.Remove(`c:\test\test.db`)}
//
創(chuàng)建新庫(kù)dbT,
errT
:=
sql.Open("sqlite3",
`c:\test\test.db`)
if
errT
!=
nil
{
t.Printfln("創(chuàng)建數(shù)據(jù)庫(kù)時(shí)發(fā)生錯(cuò)誤:%v",
errT.Error())
return}
defer
dbT.Close()SQLite數(shù)據(jù)庫(kù)是基于文件的輕量級(jí)關(guān)系型數(shù)據(jù)庫(kù)向庫(kù)中新增(插入)記錄//
開始一個(gè)數(shù)據(jù)庫(kù)事務(wù)txT,
errT
:=
dbT.Begin()if
errT
!=
nil
{
t.Printfln("新建事務(wù)時(shí)發(fā)生錯(cuò)誤:%v",
errT.Error())
return}
//
準(zhǔn)備一個(gè)SQL語句,用于向表中插入記錄stmtT,
errT
:=
txT.Prepare("insert
into
TEST(ID,
CODE)
values(?,
?)")if
errT
!=
nil
{
t.Printfln("準(zhǔn)備SQL語句插入記錄時(shí)發(fā)生錯(cuò)誤:%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插入記錄語句時(shí)發(fā)生錯(cuò)誤:%v",
errT.Error())
return
}}
txT.Commit()//
執(zhí)行事務(wù),此時(shí)新紀(jì)錄才會(huì)被真正插入到表中查詢數(shù)據(jù)庫(kù)rowsT,
errT
:=
dbT.Query("select
ID,
CODE
from
TEST")if
errT
!=
nil
{
t.Printfln("執(zhí)行SQL查詢語句時(shí)發(fā)生錯(cuò)誤:%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é)果時(shí)發(fā)生錯(cuò)誤:%v",
errT.Error())
return
}
t.Printfln("ID:
%v,
CODE:
%v",
idT,
codeT)}
//
檢查查詢結(jié)果的錯(cuò)誤errT
=
rowsT.Err()if
errT
!=
nil
{
t.Printfln("查詢結(jié)果有錯(cuò)誤:%v",
errT.Error())}目錄導(dǎo)航12.4刪除記錄、準(zhǔn)備SQL查詢等操作Contents“準(zhǔn)備”查詢數(shù)據(jù)庫(kù)的SQL語句stmtT,
errT
:=
dbT.Prepare("select
CODE
from
TEST
where
ID
=
?")if
errT
!=
nil
{
t.Printfln("準(zhǔn)備SQL查詢語句時(shí)發(fā)生錯(cuò)誤:%v",
errT.Error())
return}
defer
stmtT.Close()
var
codeT
string
errT
=
stmtT.QueryRow("5").Scan(&codeT)
if
errT
!=
nil
{
t.Printfln("從查詢結(jié)果中獲取字段數(shù)值時(shí)發(fā)生錯(cuò)誤:%v",
errT.Error())
return}
t.Printfln("第5條記錄中的CODE字段值為:%v",
codeT)送入前面用?號(hào)聲明的參數(shù)刪除數(shù)據(jù)庫(kù)記錄//
刪除TEST表中所有記錄_,
errT
=
dbT.Exec("delete
from
TEST")if
errT
!=
nil
{
t.Printfln("刪除數(shù)據(jù)庫(kù)表記錄時(shí)發(fā)生錯(cuò)誤:%v",
errT.Error())
return}//
刪除TEST表中符合條件的記錄_,
errT
=
dbT.Exec("delete
from
TESTwhereID<3")if
errT
!=
nil
{
t.Printfln("刪除數(shù)據(jù)庫(kù)表記錄時(shí)發(fā)生錯(cuò)誤:%v",
errT.Error())
return}目錄導(dǎo)航12.5獲取記錄條數(shù)、刪表等操作Contents查詢數(shù)據(jù)庫(kù)記錄條數(shù)//
查詢表中所有符合條件的記錄總數(shù)
var
countT
int64
errT
=
dbT.QueryRow("select
count(*)
from
TEST").Scan(&countT)if
errT
!=
nil
{
t.Printfln("執(zhí)行SQL查詢語句時(shí)發(fā)生錯(cuò)誤:%v",
errT.Error())
return}
t.Printfln("庫(kù)表中共有%v條記錄",
countT)刪除數(shù)據(jù)庫(kù)表查詢數(shù)據(jù)庫(kù)記錄條數(shù)//
刪除庫(kù)表
_,
errT
=
dbT.Exec(`drop
table
TEST`)if
errT
!=
nil
{
t.Printfln("刪除庫(kù)表時(shí)發(fā)生錯(cuò)誤:%v",
errT.Error())
return}目錄導(dǎo)航12.6SQL型數(shù)據(jù)庫(kù)開發(fā)總結(jié)Contents語法嚴(yán)格的益處Go語言SQL型數(shù)據(jù)庫(kù)的開發(fā)基本是類似的一般數(shù)據(jù)庫(kù)連接類型和連接字串稍作改動(dòng)即可(例:Oracle數(shù)據(jù)庫(kù)第三方包為/godror/godror,連接類型為“godror”,連接字串為`user/password@:1521/dbname`)偶爾一些數(shù)據(jù)庫(kù)特有的SQL語法稍作相應(yīng)改動(dòng)目錄導(dǎo)航12.7NoSQL型數(shù)據(jù)庫(kù)開發(fā)示例ContentsNoSQL數(shù)據(jù)庫(kù)
NoSQL是“nonSQL”的簡(jiǎn)稱(也有說是“NotonlySQL”即“不僅僅是SQL”的),由于SQL語言是關(guān)系型數(shù)據(jù)庫(kù)使用的主要語言,因此NoSQL指的是不使用關(guān)系型數(shù)據(jù)庫(kù)的新數(shù)據(jù)庫(kù)技術(shù)摒棄了傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)中用二維表來表達(dá)數(shù)據(jù)的形式主要支持的是以鍵值對(duì)(Key-ValuePair)為主的數(shù)據(jù)存儲(chǔ)方式,也支持圖像、文檔、數(shù)據(jù)對(duì)象等的存儲(chǔ)創(chuàng)建NoSQL數(shù)據(jù)庫(kù)import
(
//
應(yīng)用所需的包
"/dgraph-io/badger")……//
準(zhǔn)備創(chuàng)建數(shù)據(jù)庫(kù)的設(shè)置參數(shù)optionsT
:=
badger.DefaultOptions
//
設(shè)置數(shù)據(jù)庫(kù)的工作目錄optionsT.Dir
=
`c:\test\db`optionsT.ValueDir
=
`c:\test\db`
//
創(chuàng)建或打開數(shù)據(jù)庫(kù)dbT,
errT
:=
badger.Open(optionsT)if
errT
!=
nil
{
log.Fatal(errT)}
//
確保退出前關(guān)閉數(shù)據(jù)庫(kù)defer
dbT.Close()向NoSQL數(shù)據(jù)庫(kù)中寫入數(shù)據(jù)//
準(zhǔn)備用于測(cè)試的數(shù)據(jù),是映射類型的數(shù)據(jù)dataT
:=
make(map[string]string)
dataT["ok"]
=
"yes"dataT["名字"]
=
"張三"
//
新建一個(gè)事務(wù)transT
:=
dbT.NewTransaction(true)
//
遍歷測(cè)試數(shù)據(jù)并存入數(shù)據(jù)庫(kù)for
k,
v
:=
range
dataT
{
//
將對(duì)應(yīng)的鍵值對(duì)存入
errT
:=
transT.Set([]byte(k),
[]byte(v))
if
errT
!=
nil
{
fmt.Printf("設(shè)置KV對(duì)時(shí)發(fā)生錯(cuò)誤:%v",
errT.Error())
}
}
//
提交事務(wù),此時(shí)才真正寫入數(shù)據(jù)庫(kù)_
=
transT.Commit()按鍵名查詢NoSQL數(shù)據(jù)庫(kù)中的鍵值//
再次新建一個(gè)事務(wù)用于查詢transT
=
dbT.NewTransaction(true)
//
查詢鍵名為ok對(duì)應(yīng)的鍵值itemT,
errT
:=
transT.Get([]byte("ok"))
if
errT
!=
nil
{
log.Fatalf("獲取KV對(duì)時(shí)發(fā)生錯(cuò)誤:%v",
errT)}
//
獲取鍵值valueT,
errT
:=
itemT.ValueCopy(nil)
if
errT
!=
nil
{
log.Fatalf("獲取KV對(duì)值時(shí)發(fā)生錯(cuò)誤:%v",
errT)}
fmt.Printf("獲取到的鍵名為%v的鍵值:%v\n",
"ok",
string(valueT))遍歷NoSQL數(shù)據(jù)庫(kù)中的所有鍵值對(duì)errT
=
dbT.View(func(txn
*badger.Txn)
error
{//
用只讀模式打開數(shù)據(jù)庫(kù)
optionsT
:=
badger.DefaultIteratorOptions
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度住宅小區(qū)車位維修保養(yǎng)合同范本3篇
- 2024物流轉(zhuǎn)包商服務(wù)質(zhì)量評(píng)價(jià)體系合同
- 2024牛肉產(chǎn)業(yè)技術(shù)創(chuàng)新與研發(fā)合作合同
- 2025年度大理石石材工程環(huán)保評(píng)估與施工合同3篇
- 2025年度新能源項(xiàng)目打樁工程合作合同4篇
- 2025年度智能窗簾控制系統(tǒng)研發(fā)與集成承包合同4篇
- 2024年電商平臺(tái)運(yùn)營(yíng)服務(wù)外包合同
- 2024版項(xiàng)目股權(quán)出售合同:公司權(quán)益轉(zhuǎn)讓協(xié)議
- 2025年度新能源電池產(chǎn)品進(jìn)出口合同4篇
- 2025年度房地產(chǎn)租賃權(quán)轉(zhuǎn)讓合同3篇
- 服裝板房管理制度
- 2024年縣鄉(xiāng)教師選調(diào)進(jìn)城考試《教育學(xué)》題庫(kù)及完整答案(考點(diǎn)梳理)
- 車借給別人免責(zé)協(xié)議書
- 河北省興隆縣盛嘉恒信礦業(yè)有限公司李杖子硅石礦礦山地質(zhì)環(huán)境保護(hù)與治理恢復(fù)方案
- 第七章力與運(yùn)動(dòng)第八章壓強(qiáng)第九章浮力綜合檢測(cè)題(一)-2023-2024學(xué)年滬科版物理八年級(jí)下學(xué)期
- 醫(yī)療機(jī)構(gòu)診療科目名錄(2022含注釋)
- 微視頻基地策劃方案
- 光伏項(xiàng)目質(zhì)量評(píng)估報(bào)告
- 八年級(jí)一本·現(xiàn)代文閱讀訓(xùn)練100篇
- 2023年電池系統(tǒng)測(cè)試工程師年度總結(jié)及下一年計(jì)劃
- 應(yīng)急預(yù)案評(píng)分標(biāo)準(zhǔn)表
評(píng)論
0/150
提交評(píng)論