DB庫僅是mysql client庫的一個(gè)lua實(shí)現(xiàn)封裝, 在初始化后即可在任何地方引用.
DB庫內(nèi)部封裝了一個(gè)簡單的連接池, 方便大家在使用的時(shí)候無需手動(dòng)管理MySQL session生命周期.
DB庫有自動(dòng)的斷線、超時(shí)重連機(jī)制, 但這僅限于底層網(wǎng)絡(luò)出現(xiàn)抖動(dòng)時(shí)保證session重連(超過連接次數(shù)將會(huì)拋出異常).
使用db.init進(jìn)行初始化, opt參數(shù)是一個(gè)lua table. 請(qǐng)根據(jù)實(shí)際情況傳入如下字段:
此方法的返回值(true)用來判斷是否初始化成功, 初始化失敗將會(huì)進(jìn)行重復(fù)嘗試. 到達(dá)最大嘗試次數(shù)后會(huì)拋出異常.
由于會(huì)拋出異常, 所以在初始化階段如果有業(yè)務(wù)需要請(qǐng)自行用pcall
或者xpcall
封裝.
DB初始化完成后即可使用, 否則將會(huì)出現(xiàn)不可預(yù)料的錯(cuò)誤.
DB.query為原始SQL使用方法, 參數(shù)SQL為一個(gè)字符串類型; 方便在四大標(biāo)準(zhǔn)查詢語句無法滿足需求時(shí)使用.
使用示例:
DB.query("show variables like 'wait_timeout'")
DB.query方法與mysql庫原始的query方法不同之處在于DB.query支持連接池、斷線重連、自動(dòng)生命周期管理.
DB初始化完成后即可使用, 否則將會(huì)出現(xiàn)不可預(yù)料的錯(cuò)誤.
DB.select方法返回一個(gè)SQL查詢對(duì)象, 內(nèi)置了一些SQL Select語句所需方法; 方便使用者使用面相對(duì)象的語法寫出漂亮的SQL語句;
使用示例:
local ret, err = DB.select({"id", "name", "user", "passwd"})
:from({"user"})
:where({
{"id", "!=", "0"},
"AND",
{"id", ">=", "1"},
"OR",
{"user", "!=", "admin"},
"AND",
{"user", "=", "admin"},
"OR",
{"user", "IS", "NOT", "NULL"},
"AND",
{"user", "IS", "NULL"},
"AND",
{"user", "IN", {1, 2, 3, 4, 5}},
"AND",
{"user", "NOT", "IN", {1, 2, 3, 4, 5}},
"AND",
{"user", "BETWEEN", {1, 100}},
"AND",
{"user", "NOT", "BETWEEN", {1, 100}},
})
:groupby('id') -- (optional) groupby({"name", "user"})
:orderby("id") -- (optional) orderby({"name", "user"})
:asc() -- (optional) or desc()
:limit(1) -- (optional) limit("1") limit(1, 100)
:execute() -- (must have) 最后加上這個(gè)方法才會(huì)真正執(zhí)行
注意:
此方法有2個(gè)返回值, ret為結(jié)果集(list)或者nil, err為當(dāng)ret為nil時(shí)的錯(cuò)誤信息(string)
DB初始化完成后即可使用, 否則將會(huì)出現(xiàn)不可預(yù)料的錯(cuò)誤.
DB.update方法返回一個(gè)SQL更新對(duì)象, 內(nèi)置了一些SQL Update語句所需方法; 方便使用者使用面相對(duì)象的語法寫出漂亮的SQL語句;
local ret, err = DB.update("user")
:set({
{"name", "=", "管理員"},
{"user", "=", "Administrator"},
{"passwd", "=", "Administrator"},
})
:where({
{"id", "<=", 1},
})
:limit(1)
:execute()
此方法有2個(gè)返回值, ret為結(jié)果集(list)或者nil, err為當(dāng)ret為nil時(shí)的錯(cuò)誤信息(string)
DB初始化完成后即可使用, 否則將會(huì)出現(xiàn)不可預(yù)料的錯(cuò)誤.
DB.insert方法返回一個(gè)SQL更新對(duì)象, 內(nèi)置了一些SQL Insert語句所需方法; 方便使用者使用面相對(duì)象的語法寫出漂亮的SQL語句;
local ret, err = DB.insert("user")
:fields({"name", "user", "passwd"})
:values({
{"candy", "root", "123456789"},
{"水果糖", "admin", "123456789"},
})
:execute()
此方法有2個(gè)返回值, ret為結(jié)果集(list)或者nil, err為當(dāng)ret為nil時(shí)的錯(cuò)誤信息(string)
DB初始化完成后即可使用, 否則將會(huì)出現(xiàn)不可預(yù)料的錯(cuò)誤.
DB.delete方法返回一個(gè)SQL更新對(duì)象, 內(nèi)置了一些SQL Delete語句所需方法; 方便使用者使用面相對(duì)象的語法寫出漂亮的SQL語句;
local ret, err = DB.delete("user")
:where({
{"id", ">", 1},
})
:orderby("id")
:limit(1)
:execute()
此方法有2個(gè)返回值, ret為結(jié)果集(list)或者nil, err為當(dāng)ret為nil時(shí)的錯(cuò)誤信息(string)
DB庫不需要進(jìn)行class初始化, 因?yàn)樵趯?shí)現(xiàn)之初未使用class對(duì)象進(jìn)行構(gòu)造; 所以可以在任何地方進(jìn)行初始化;
DB庫滿足大部分日常SQL查詢與聯(lián)合查詢相關(guān)使用; 具體使用方法可參考scrit/test_DB.lua
示例.
更多建議: