Home

openresty 使用lua 查询 mysql

测试地址: http://36.137.72.219:9501/hello?page=1

nginx 配置

location /hello {
            default_type application/json;
            add_header Content-Type 'application/json; charset=utf-8';
            content_by_lua_file lua/hello.lua;
 }

hello.lua

-- 1) 自定义close函数
 
local function close_db(db)  
    if not db then  
        return  
    end  
    --  连接池机制:不调用close,选择keepalive 确保性能
    local pool_max_idle_time = 10000 --毫秒  
    local pool_size = 100 --连接池大小  
    local ok, err = db:set_keepalive(pool_max_idle_time, pool_size)  
    if not ok then  
        ngx.say("set keepalive error : ", err)  
    end  
end
 
-- 2) 引入mysql实例
local mysql = require("resty.mysql")
local cjson = require("cjson") 
-- 3) 创建实例
local db, err = mysql:new()
if not db then
    ngx.say("new mysql error : ", err)
    return
end
 
--4) 设置超时时间
db:set_timeout(10000)
 
--5) 定义连接属性
local props = {
    host = "127.0.0.1",
    port = 3306,
    database = 'wuxi_dev',
    user = 'root',
    password = 'root',
    charset = 'utf8'
}
 
-- 6) 建立连接
local res,err,errno,sqlstate = db:connect(props)
-- 备注:异常判断,异常消息统一处理
if not res then
    ngx.say("connect to mysql error:", err,", errno:", errno,", sqlstate:", sqlstate)
    return close_db(db)
end
 
-- 7) sql 语句操作 -->过程省略
local request_method = ngx.var.request_method
local args = nil
if "GET" == request_method then
    args = ngx.req.get_uri_args()
    print('get==========')
elseif "POST" == request_method then
    ngx.req.read_body()
    args = ngx.req.get_post_args()
    print('post==========')
end

local page = 1
for k,v in pairs(args) do  
	if(k == 'page') then
		page = v
	end
end

local from = 10 * (page - 1)

local select_sql = string.format("select id,title,year,term,cover from magazine limit %d,10",from)

res, err, errno, sqlstate = db:query(select_sql)
if not res then
    ngx.say("select table error :", err,", errno", errno, ", sqlstate : ",sqlstate)
    return close_db(db)
end
 
ngx.say(cjson.encode(res))
 
-- 8) 关闭连接 -->由于使用连接池,不需要每次都使用密码
 
close_db(db)