DB
DB库
DB库仅是mysql client库的一个lua实现封装, 在初始化后即可在任何地方引用.
DB库内部封装了一个简单的连接池, 方便大家在使用的时候无需手动管理MySQL session生命周期.
DB库有自动的断线、超时重连机制, 但这仅限于底层网络出现抖动时保证session重连(超过连接次数将会抛出异常).
db.init(opt)
使用db.init进行初始化, opt参数是一个lua table. 请根据实际情况传入如下字段:
- host = '你的mysql主机名或ip地址'
- port = 3306, mysql主机端口
- user = '用于连接mysql的用户'
- password = '用于连接mysql的密码'
- 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) 最后加上这个方法才会真正执行
注意:
- select方法与SQL的select查询语句类似且不可改变顺序, 否则程序将会抛出异常.
- 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
示例.
更多建议: