DB

2019-04-02 11:44 更新

DB庫

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(opt)

使用db.init進(jìn)行初始化, opt參數(shù)是一個(gè)lua table. 請(qǐng)根據(jù)實(shí)際情況傳入如下字段:

  1. host = '你的mysql主機(jī)名或ip地址'

  1. port = 3306, mysql主機(jī)端口

  1. user = '用于連接mysql的用戶'

  1. password = '用于連接mysql的密碼'

  1. database = 'use db', 可選(optional)

此方法的返回值(true)用來判斷是否初始化成功, 初始化失敗將會(huì)進(jìn)行重復(fù)嘗試. 到達(dá)最大嘗試次數(shù)后會(huì)拋出異常.

由于會(huì)拋出異常, 所以在初始化階段如果有業(yè)務(wù)需要請(qǐng)自行用pcall或者xpcall封裝.

DB.query(SQL)

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.select(fields)

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í)行

注意:

  1. select方法與SQL的select查詢語句類似且不可改變順序, 否則程序?qū)?huì)拋出異常.

  1. select方法最后在excute時(shí)會(huì)進(jìn)行一些基礎(chǔ)判斷, 判斷信息將會(huì)在打印在stdou或者日志文件內(nèi).

此方法有2個(gè)返回值, ret為結(jié)果集(list)或者nil, err為當(dāng)ret為nil時(shí)的錯(cuò)誤信息(string)

DB.update(db_name)

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.insert(db_name)

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.delete(db_name)

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示例.

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)