博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql.lua 读改增删封装类,符合习惯使用
阅读量:7004 次
发布时间:2019-06-27

本文共 5863 字,大约阅读时间需要 19 分钟。

  hot3.png

local mysql = require "resty.mysql"local _M = {    host = "127.0.0.1",    port = 3306,    database = "",    user = "root",    password = "",    charset = "utf8",    tablePrefix = '',    timeout = 1000,    max_packet_size = 1024 * 1024,}function _M:new(config)    config = config or {}    setmetatable(config, self)    self.__index = self    return configendfunction _M:connect()    local db, err = mysql:new()    if not db then        ngx.log(ngx.ERR, "failed to instantiate mysql: ", err)        return nil    end    db:set_timeout(self.timeout)    local ok, err, errcode, sqlstate = db:connect {        host = self.host,        port = self.port,        database = self.database,        user = self.user,        password = self.password,        max_packet_size = self.max_packet_size,    }    if not ok then        ngx.log(ngx.ERR, "failed to connect: ", err, ": ", errcode, " ", sqlstate)        return nil    end    local ok, err = db:get_reused_times()    if (not ok or ok == 0) and self.charset then        db:query('SET NAMES ' .. self.charset)    end    self.db = db    return trueendfunction _M:set_keepalive(max_idle_timeout, pool_size)    max_idle_timeout = max_idle_timeout or 10000    pool_size = pool_size or 10    local ok, err = self.db:set_keepalive(max_idle_timeout, pool_size)    if not ok then        ngx.log(ngx.ERR, "failed to set_keepalive: ", err)        return nil    end    return trueendfunction _M:tbname(tableName)    return self.tablePrefix .. tableNameendfunction _M:query(sql, nrows)    --ngx.log(ngx.ERR, "query sql: ", sql)    local res, err, errno, sqlstate = self.db:query(sql, nrows)    if not res then        ngx.log(ngx.ERR, "bad count result: ", err, ": ", errno, ": ", sqlstate, " sql:", sql)        return nil    end    return resendfunction _M:count(tbname, where, sql)    local count = 0    if not sql then        where = where or '1=1'    end    local sql = string.format("SELECT COUNT(1) AS NUM FROM %s WHERE %s", self:tbname(tbname), where)    local res = self:query(sql, 1)    if res then        count = tonumber(res[1]['NUM']) or 0    end    return countendfunction _M:find(tbname, where, field, order, sql)    if not sql then        where = where or '1=1'        field = field or '*'        order = order and string.format('order by %s', order) or ''        if type(field) == 'table' then            field = string.format('`%s`', table.concat(field, '`,`'))        end        sql = string.format("SELECT %s FROM %s WHERE %s %s limit 1",            field, self:tbname(tbname), where, order)    end    local res = self:query(sql, 1)    if not res then        return false    end    return res[1]endfunction _M:findOne(tbname, where, field, order, sql)    if not sql then        where = where or '1=1'        field = field or 'id'        order = order and string.format('order by %s', order) or ''        sql = string.format("SELECT `%s` FROM %s WHERE %s %s limit 1",            field, self:tbname(tbname), where, order)    end    local res = self:query(sql, 1)    if not res then        return false    end    return res[1][field]endfunction _M:findAll(tbname, where, field, order, limit, sql)    if not sql then        where = where or '1=1'        field = field or '*'        order = order and string.format('order by %s', order) or ''        limit = limit and string.format('limit %s', limit) or ''        if type(field) == 'table' then            field = string.format('`%s`', table.concat(field, '`,`'))        end        sql = string.format("SELECT %s FROM %s WHERE %s %s %s",            field, self:tbname(tbname), where, order, limit)    end    local res = self:query(sql, 1)    return resendfunction _M:findCol(tbname, where, field, order, limit, sql)    if not sql then        where = where or '1=1'        field = field or 'id'        order = order and string.format('order by %s', order) or ''        limit = limit and string.format('limit %s', limit) or ''        sql = string.format("SELECT %s FROM %s WHERE %s %s %s",            field, self:tbname(tbname), where, order, limit)    end    local res = self:query(sql)    if not res then        return false    end    local t = {}    for k, r in pairs(res) do        t[k] = r[field]    end    return tendfunction _M:insert(tbname, params)    if type(params) ~= 'table' then        ngx.log(ngx.ERR, 'mysql insert params required table', type(params))        return false    end    local field, valus = {}, {}    local index = 1;    for k, v in pairs(params) do        field[index] = k        valus[index] = ngx.quote_sql_str(v)        index = index + 1    end    field = table.concat(field, '`,`')    valus = table.concat(valus, ",")    local sql = string.format("INSERT INTO %s (`%s`) VALUES (%s)", self:tbname(tbname), field, valus)    local res = self:query(sql)    if not res then        return false    end    return res.insert_idendfunction _M:update(tbname, where, params)    if type(params) ~= 'table' then        ngx.log(ngx.ERR, 'mysql update params required table')        return false    end    local field = {}    local index = 1;    for k, v in pairs(params) do        field[index] = string.format("`%s`=%s", k, ngx.quote_sql_str(v))        index = index + 1    end    field = table.concat(field, ',')    local sql = string.format("UPDATE %s SET %s WHERE %s", self:tbname(tbname), field, where)    local res = self:query(sql)    if not res then        return false    end    return res.affected_rowsendfunction _M:delete(tbname, where)    local sql = string.format("DELETE FROM %s WHERE %s", self:tbname(tbname), where)    local res = self:query(sql)    if not res then        return false    end    return res.affected_rowsendfunction _M:close()    local ok, err = self.db:close()    if not ok then        ngx.say("failed to close: ", err)        return false    end    return trueendreturn _M

 

转载于:https://my.oschina.net/itlong/blog/1036610

你可能感兴趣的文章
python返回汉字的首字母
查看>>
linux下yum更新出现HTTP Error 404 NOT FOUND错误的办法
查看>>
Nginx负载均衡配置实例
查看>>
Percona-mysql-5.5.38双主复制&mmm配置
查看>>
spring高级 之 拦截器
查看>>
Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化
查看>>
我的友情链接
查看>>
多个viewpager可能产生的问题
查看>>
理解自组织:敏捷里的自组织团队都是骗人的
查看>>
Java监控神器之psi-probe监控Tomcat和应用
查看>>
LCT
查看>>
VIJOS-P1635 城市连接
查看>>
chown命令详情
查看>>
强数学归纳法
查看>>
第三次作业结对编程
查看>>
jQuery总结(摘抄)
查看>>
_stat函数/struct stat 结构体使用笔记
查看>>
二分搜索 HDOJ 2289 Cup
查看>>
Byte[]、Image、Bitmap 之间的相互转换
查看>>
分布式全文检索引擎之ElasticSearch
查看>>