lua 操作数据库

本文介绍了一个Lua MySQL操作的封装库,通过简化连接和关闭过程,使得开发者能够更方便地进行MySQL数据库的操作。此外,还展示了如何获取用户输入并查询MySQL数据库,最后返回JSON数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

操作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 command = ("insert into ip_access (`ip`) values ('" .. val .. "')");
local select = ("select * from ip_access where status = 1 and ip = ('" .. addr_ip .. "')");
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部分

转载于:https://www.cnblogs.com/guixiaoming/p/8359217.html

### 使用 Lua数据库插入数据 要实现使用 Lua 将数据插入到 MySQL 数据库中,首先需要确保已安装必要的依赖项,例如 `lua`、`mysql` 驱动以及 `luasql-mysql`[^1]。以下是完整的代码示例及其说明: #### 示例代码 ```lua -- 加载 luasql 模块 local luasql = require("luasql.mysql") -- 创建环境对象 local env = assert(luasql:mysql()) -- 连接到数据库 (替换为你自己的数据库名、用户名和密码) local conn = assert(env:connect("testdb", "root", "password", "localhost")) -- 准备 SQL 插入语句 local sql = [[INSERT INTO sample(id, name) VALUES(?, ?)]] -- 执行插入操作 local cursor, err = conn:execute(sql, {101, "Alice"}) if not cursor then print("Error inserting data:", err) else print("Data inserted successfully!") end -- 关闭连接并释放资源 cursor:close() conn:close() env:close() ``` 上述代码展示了如何通过 Lua 和 `luasql-mysql` 实现向 MySQL 数据库中的表 `sample` 插入一条记录的操作。 --- #### 代码解析 1. **加载模块**: 使用 `require("luasql.mysql")` 来引入 `luasql` 的 MySQL 支持。 2. **创建环境对象**: 调用 `luasql:mysql()` 方法来初始化一个 MySQL 环境对象。 3. **建立连接**: 使用 `env:connect(database_name, user, password, host)` 建立与目标数据库的连接[^4]。 4. **执行插入**: 定义 SQL 查询字符串并通过 `conn:execute(query_string, params_table)` 方法完成参数化的插入操作。 5. **错误处理**: 如果发生异常,则捕获错误信息并打印提示消息。 6. **清理资源**: 在最后关闭游标 (`cursor`)、断开数据库连接 (`conn`) 并销毁环境对象 (`env`)。 --- #### 注意事项 - 替换代码中的 `"testdb"`、`"root"` 和 `"password"` 参数为实际使用的数据库名称、用户名及密码。 - 表 `sample` 应提前存在,并具有匹配字段 `(id, name)` 的结构。 - 推荐使用参数化查询以防止 SQL 注入攻击。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值