openresty前端開發入門五之Mysql篇

路人jia發表於2018-08-23

openresty 前端開發入門五之Mysql篇

這章主要演示怎麼通過lua連線mysql,並根據使用者輸入的name從mysql獲取資料,並返回給使用者

操作mysql主要用到了lua-resty-mysql庫,程式碼可以在github上找得到

而且上面也有例項程式碼

由於官網給出的例子比較基本,程式碼也比較多,所以我這裡主要介紹一些怎麼封裝一下,簡化我們呼叫的程式碼

lua/mysql.lua

local mysql = require "resty.mysql"

local config = {
    host = "localhost",
    port = 3306,
    database = "mysql",
    user = "root",
    password = "admin"
}

local _M = {}


function _M.new(self)
    local db, err = mysql:new()
    if not db then
        return nil
    end
    db:set_timeout(1000) -- 1 sec

    local ok, err, errno, sqlstate = db:connect(config)

    if not ok then
        return nil
    end
    db.close = close
    return db
end

function close(self)
    local sock = self.sock
    if not sock then
        return nil, "not initialized"
    end
    if self.subscribed then
        return nil, "subscribed state"
    end
    return sock:setkeepalive(10000, 50)
end

return _M

其實就是簡單把連線,跟關閉做一個簡單的封裝,隱藏繁瑣的初始化已經連線池細節,只需要呼叫new,就自動就連結了redis,close自動使用連線池

lua/hello.lua

local cjson = require "cjson"
local mysql = require "mysql"
local req = require "req"

local args = req.getArgs()

local name = args[`name`]

if name == nil or name == "" then
    name = "root"    
end

name = ngx.quote_sql_str(name) -- SQL 轉義,將 ` 轉成 `, 防SQL隱碼攻擊,並且轉義後的變數包含了引號,所以可以直接當成條件值使用

local db = mysql:new()

local sql = "select * from user where User = " .. name

ngx.say(sql)
ngx.say("<br/>")

local res, err, errno, sqlstate = db:query(sql)
db:close()
if not res then
    ngx.say(err)
    return {}
end

ngx.say(cjson.encode(res))

訪問
http://localhost/lua/hello?name=root

即可獲取mysql中的name為root的的所有使用者,如果沒有name引數,則預設獲取root的值

從輸出的資料中,可以看出res其實是一個陣列,而且不管返回的資料是多少條,它都是一個陣列,當我們查詢的結果只有一條的時候,可以通過 res[1] 來獲取一條記錄,每一行資料又是一個table,可以通過列名來得到value

ok,到這裡我們已經可以獲取使用者輸入的值,並且從mysql中獲取資料,然後返回json資料了,已經可以開發一些簡單的介面了

示例程式碼 參見demo5部分


相關文章