lua 模块 案例 lua应用实例_mysql

 这边我是用的是Lua53

lua 模块 案例 lua应用实例_开发语言_02

 一些基本的操作可以在Lua菜鸟教程去寻找想要进行的操作:

Lua 教程 | 菜鸟教程 (runoob.com)

Lua一般有8个基本类型

nil

这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。

boolean

包含两个值:false和true。

number

表示双精度类型的实浮点数

string

字符串由一对双引号或单引号来表示

function

由 C 或 Lua 编写的函数

userdata

表示任意存储在变量中的C数据结构

thread

表示执行的独立线路,用于执行协同程序

table

Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。

函数

lua中也可以定义函数,类似于java中的方法。例如:


--[[ 函数返回两个值的最大值 --]]
function max(num1, num2)

   if (num1 > num2) then
      result = num1;
   else
      result = num2;
   end

   return result; 
end
-- 调用函数
print("两值比较最大值为 ",max(10,4))
print("两值比较最大值为 ",max(5,6))
执行之后的结果:


两值比较最大值为     10
两值比较最大值为     6


..:表示拼接

table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。

Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。

案例:


-- 初始化表mytable = {}
-- 指定值mytable[1]= "Lua"
-- 移除引用mytable = nil


-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}
 -- 定义一个常量
module.constant = "这是一个常量"
 -- 定义一个函数
function module.func1()
print("这是一个公有函数")
end
 local function func2()
print("这是一个私有函数!")
end
function module.func3()
func2()
end
 return module

由上可知,模块的结构就是一个 table 的结构,因此可以像操作调用 table 里的元素那样来操作调用模块里的常量或函数。

上面的 func2 声明为程序块的局部变量,即表示一个私有函数,因此是不能从外部访问模块里的这个私有函数,必须通过模块里的公有函数来调用.

(2)require 函数

require 用于 引入其他的模块,类似于java中的类要引用别的类的效果。

用法:


require("<模块名>")
require"<模块名>"


两种都可以。

我们可以将上面定义的module模块引入使用,创建一个test_module.lua文件,代码如下:

-- test_module.lua 文件
-- module 模块为上文提到到 module.luarequire("module")
print(module.constant)
module.func3()

openResty入门案例

首先要修改配置文件(安装的地方)

D:\openresty-1.15.8.2-win64\conf

lua 模块 案例 lua应用实例_redis_03

 

D:\openresty-1.15.8.2-win64\conf

lua 模块 案例 lua应用实例_mysql_04

 

用content_by_lua_file来引入一个lua文件

在一些高并发的场景中,我们常常会用到缓存技术,现在我们常用的分布式缓存redis是最知名的,操作redis,我们需要引入redis模块 require "resty.redis"

local function close_redis(red)
    if not red then
        return
    end
    -- 释放连接(连接池实现),毫秒
    local pool_max_idle_time = 10000 
    -- 连接池大小
    local pool_size = 100 
    local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
    local log = ngx_log
    if not ok then
        log(ngx_ERR, "set redis keepalive error : ", err)
    end
end

-- 连接redis
local redis = require('resty.redis')
local red = redis.new()
red:set_timeout(1000)

local ip = "127.0.0.1"
local port = "6379" 
local pwd= "ok"
ok = red:connect(ip,port)

if not ok then
    ngx.say("failed to auth: ", err)
    return close_redis(red)
end
if not ok then
    return close_redis(red)
end
ok = red:auth(pwd)
if not ok then
    ngx.say("failed to auth: ", err)
    return close_redis(red)
end

red:select('0')
red:set("msg","test ngx hello") 
local resp = red:get("msg")  
if not resp then  
    ngx.say("get msg error : ", err)  
    return close_redis(red)  
end
ngx.say("msg : ", resp)
close_redis(red)

获取POST请求参数

ngx.req.read_body()
local arg = ngx.req.get_post_args()
name=nil
pwd=nil
for k,v in pairs(arg) do 
	if k=="name" then
		name=v
	end
	if k=="pwd" then
		pwd = v
	end 
end 
ngx.say("name : ", name)
ngx.say("pwd : ", pwd)

openresty中操作mysql

--请求参数
ngx.req.read_body()
local arg = ngx.req.get_post_args()
deptname=nil
--获取数据
for k,v in pairs(arg) do 
	if k=="deptname" then
		deptname = v
	end
end 

ngx.say("deptname : ", deptname)

--创建连接mysql模块
local mysql = require "resty.mysql"
-- connect to mysql;
local db, err = mysql:new()
if not db then
	return false
end
db:set_timeout(1000)
--设置连接信息
local ok, err, errno, sqlstate = db:connect{
	host = "127.0.0.1",
	port = 3306,
	database = "bye",
	user = "root",
	password = "ok"
}
--验证是否连接上
if not ok then
	ngx.say("connect mysql failed")
	return false
end

if db == false then
    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
    return
end

ngx.say("----------插入数据部门----------------","<br/>")
--执行添加
res, err, errcode, sqlstate = 
    db:query("insert into dept values (null,'"..deptname.."')") 
if not res then 
    ngx.say("insert failed")
    return 
end
ngx.say("insert rows :", res.affected_rows,", id", res.insert_id, "<br/>")

查询数据并返回json

lua 模块 案例 lua应用实例_mysql_05

--请求参数
ngx.req.read_body()
local arg = ngx.req.get_post_args()
deptname=nil
--获取数据
for k,v in pairs(arg) do 
	if k=="deptname" then
		deptname = v
	end
end 
ngx.say("deptname : ", deptname)
--创建连接mysql模块
local mysql = require "resty.mysql"
-- connect to mysql;
local db, err = mysql:new()
if not db then
	return false
end
db:set_timeout(1000)
--设置连接信息
local ok= db:connect{
	host = "127.0.0.1",
	port = 3306,
	database = "bye",
	user = "root",
	password = "ok",
	max_packet_size = 1024 * 1024 
}
--验证是否连接上
if not ok then
	ngx.say("connect mysql failed")
	return false
end

if db == false then
    ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
    return
end

ngx.say("----------根据名称查询数据部门----------------","<br/>")

res =
    db:query("SELECT * FROM `dept` WHERE deptname LIKE '%"..deptname.."%'")
if not res then
    ngx.say("bad result: ", err, ": ", errcode, ": ", sqlstate, ".")
    return
end

local cjson = require "cjson"
ngx.say("result: ", cjson.encode(res))