DB

2019-04-02 11:44 更新

DB库

DB库仅是mysql client库的一个lua实现封装, 在初始化后即可在任何地方引用.

DB库内部封装了一个简单的连接池, 方便大家在使用的时候无需手动管理MySQL session生命周期.

DB库有自动的断线、超时重连机制, 但这仅限于底层网络出现抖动时保证session重连(超过连接次数将会抛出异常).

db.init(opt)

使用db.init进行初始化, opt参数是一个lua table. 请根据实际情况传入如下字段:

  1. host = '你的mysql主机名或ip地址'

  1. port = 3306, mysql主机端口

  1. user = '用于连接mysql的用户'

  1. password = '用于连接mysql的密码'

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

此方法的返回值(true)用来判断是否初始化成功, 初始化失败将会进行重复尝试. 到达最大尝试次数后会抛出异常.

由于会抛出异常, 所以在初始化阶段如果有业务需要请自行用pcall或者xpcall封装.

DB.query(SQL)

DB初始化完成后即可使用, 否则将会出现不可预料的错误.

DB.query为原始SQL使用方法, 参数SQL为一个字符串类型; 方便在四大标准查询语句无法满足需求时使用.

使用示例:

  DB.query("show variables like 'wait_timeout'")

DB.query方法与mysql库原始的query方法不同之处在于DB.query支持连接池、断线重连、自动生命周期管理.

DB.select(fields)

DB初始化完成后即可使用, 否则将会出现不可预料的错误.

DB.select方法返回一个SQL查询对象, 内置了一些SQL Select语句所需方法; 方便使用者使用面相对象的语法写出漂亮的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) 最后加上这个方法才会真正执行

注意:

  1. select方法与SQL的select查询语句类似且不可改变顺序, 否则程序将会抛出异常.

  1. select方法最后在excute时会进行一些基础判断, 判断信息将会在打印在stdou或者日志文件内.

此方法有2个返回值, ret为结果集(list)或者nil, err为当ret为nil时的错误信息(string)

DB.update(db_name)

DB初始化完成后即可使用, 否则将会出现不可预料的错误.

DB.update方法返回一个SQL更新对象, 内置了一些SQL Update语句所需方法; 方便使用者使用面相对象的语法写出漂亮的SQL语句;

    local ret, err = DB.update("user")
        :set({
            {"name", "=", "管理员"},
            {"user", "=", "Administrator"},
            {"passwd", "=", "Administrator"},
        })
        :where({
            {"id", "<=", 1},
        })
        :limit(1)
        :execute()

此方法有2个返回值, ret为结果集(list)或者nil, err为当ret为nil时的错误信息(string)

DB.insert(db_name)

DB初始化完成后即可使用, 否则将会出现不可预料的错误.

DB.insert方法返回一个SQL更新对象, 内置了一些SQL Insert语句所需方法; 方便使用者使用面相对象的语法写出漂亮的SQL语句;

    local ret, err = DB.insert("user")
        :fields({"name", "user", "passwd"})
        :values({
            {"candy", "root", "123456789"},
            {"水果糖", "admin", "123456789"},
        })
        :execute()

此方法有2个返回值, ret为结果集(list)或者nil, err为当ret为nil时的错误信息(string)

DB.delete(db_name)

DB初始化完成后即可使用, 否则将会出现不可预料的错误.

DB.delete方法返回一个SQL更新对象, 内置了一些SQL Delete语句所需方法; 方便使用者使用面相对象的语法写出漂亮的SQL语句;

    local ret, err = DB.delete("user")
        :where({
            {"id", ">", 1},
        })
        :orderby("id")
        :limit(1)
        :execute()

此方法有2个返回值, ret为结果集(list)或者nil, err为当ret为nil时的错误信息(string)

其它

DB库不需要进行class初始化, 因为在实现之初未使用class对象进行构造; 所以可以在任何地方进行初始化;

DB库满足大部分日常SQL查询与联合查询相关使用; 具体使用方法可参考scrit/test_DB.lua示例.

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号