版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 店鋪轉(zhuǎn)讓合同文本
- 珍視婚姻拒絕出軌
- 補(bǔ)充合同的書寫范本
- 煉油廠管件購銷合同
- 全面運維服務(wù)合同范本
- 軟件選購合同示例
- 酒店用品購買協(xié)議
- 陶瓷截止閥采購合同
- 水泥磚買賣協(xié)議模板
- 土石方施工項目作業(yè)勞務(wù)分包合同
- 鈴木教學(xué)法在我國鋼琴教學(xué)中的應(yīng)用研究 開題
- 掘進(jìn)迎頭預(yù)防冒頂片幫安全技術(shù)措施
- 【MOOC】操作系統(tǒng)及Linux內(nèi)核-西安郵電大學(xué) 中國大學(xué)慕課MOOC答案
- 全新危險廢物運輸安全協(xié)議(2024版)3篇
- 混凝土輸送泵車安全操作規(guī)程(4篇)
- 【MOOC】模擬電子技術(shù)基礎(chǔ)-華中科技大學(xué) 中國大學(xué)慕課MOOC答案
- 科研倫理與學(xué)術(shù)規(guī)范(研究生)期末試題
- 2024年網(wǎng)格員考試題庫完美版
- 北京市矢量地圖-可改顏色
- 2020年度圖書館中級職稱專業(yè)技術(shù)資格考試題庫
- 南京工業(yè)大學(xué)甲醇制氫工藝設(shè)計(反應(yīng)器)
評論
0/150
提交評論