Lua两种方式操作MySQL

本文演示FastWeb网站开发中两种方式处理MySQL请求与数据

示例演示如何连接、查询、删除与更新,SQL在文章底部。

原生预处理方式

  • 优点:高度自定义,方便处理复杂逻辑与数据
  • 缺点:不如语句构建器方案简单
local dkjson = require("dkjson")
local conn = mysql_conn.new()

-- 建立连接
function mysql_connect()
    local conn_result = conn:connect("127.0.0.1","root","root","test","utf8mb4",3306)
    if conn_result == 0 then
        -- 连接成功
        return true
    elseif conn_result == 1 then
        -- 连接超时
        return false,"timeout"
    elseif conn_result == 2 then
        -- 连接错误
        return false,conn:last_error()
    end
end
-- 清空示例
function mysql_delete()
    -- 清空数据
    local ppst = conn:setsql("DELETE FROM users")
    ppst:update()
end
-- 插入数据
function mysql_insert()
    local ppst = conn:setsql("INSERT INTO users(username,password,age,data,head)VALUES(?,?,?,?,?)")
    -- 文本
    ppst:set_str(1,"fastweb")
    ppst:set_str(2,"123456")
    -- 数字
    ppst:set_i32(3,25)
    -- 二进制
    ppst:set_str(4,"996\x0088")
    -- 字节流
    local head_file = io.open(website_dir().."/head.png", "rb")
    local head_content = head_file:read("all")
    head_file:close()
    ppst:set_blob(5,head_content)

    ppst:update()
end
-- 更新数据
function mysql_update()
    local ppst = conn:setsql("UPDATE users SET age = ? WHERE username = ?")
    ppst:set_i32(1,66)
    ppst:set_str(2,"fastweb")
    ppst:update()
end
-- 查询数据
function mysql_select()
    local ppst = conn:setsql("SELECT * FROM users WHERE age > ?")
    ppst:set_i32(1,0)
    -- 查询结果
    local result = ppst:query();

    local users = {}
    while result:next() do
        local user = {
            username = result:get("username"),
            password = result:get("password"),
            age = result:get("age"),
            data_size = #result:get("data"),
            head_size = #result:get("head")
        }
        table.insert(users,user)
    end
    return users;
end


-- 连接
local is_success,error_msg = mysql_connect()
if is_success == false then
    response:send("connect failed,"..error_msg)
    return
end

mysql_delete();
mysql_insert();
mysql_select();
local users = mysql_select()
response:send(dkjson.encode(users))

SQL构建器方式

  • 优点:集成度高、美观、代码简洁
  • 缺点:不适用较复杂的SQL语句
local dkjson = require("dkjson")
local conn = mysql_conn.new()

-- 建立连接
function mysql_connect()
    local conn_result = conn:connect("127.0.0.1","root","root","test","utf8mb4",3306)
    if conn_result == 0 then
        -- 连接成功
        return true
    elseif conn_result == 1 then
        -- 连接超时
        return false,"timeout"
    elseif conn_result == 2 then
        -- 连接错误
        return false,conn:last_error()
    end
end
-- 清空示例
function mysql_delete()
    -- 清空数据
    conn:delete():table("users"):exec()
end
-- 插入数据
function mysql_insert()
    -- 字节流
    local head_file = io.open(website_dir().."/head.png", "rb")
    local head_content = head_file:read("all")
    head_file:close()

    local insert = conn:insert():table("users")
        :set_str("username","fastweb")
        :set_str("password","123456")
        :set_i32("age",25)
        :set_blob("data","996\x0088")
        :set_blob("head",head_content)
        :exec()
end
-- 更新数据
function mysql_update()
    conn:update():table("users"):set_i32("age",66):where_str("username","=","fastweb"):exec()
end
-- 查询数据
function mysql_select()
    return conn:select():table("users"):field({"username","password","age"}):where_i32("age",">",0):query():table()
end

-- 连接
local is_success,error_msg = mysql_connect()
if is_success == false then
    response:send("connect failed,"..error_msg)
    return
end

mysql_delete();
mysql_insert();
mysql_select();
local users = mysql_select()
response:send(dkjson.encode(users))

SQL文件

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `age` int(11) NULL DEFAULT NULL,
  `data` binary(255) NULL DEFAULT NULL,
  `head` blob NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 38 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在 Lua 中写入 MySQL,您需要使用 Lua MySQL 驱动程序。目前有多个 MySQL 驱动程序可供选择,如 LuaSQL 和 luasql-mysql 等。在这里,我们以 luasql-mysql 为例。 首先,您需要安装 luasql-mysql 驱动程序。您可以使用 LuaRocks 进行安装,命令如下: ``` luarocks install luasql-mysql ``` 接下来,您可以使用以下代码来连接 MySQL 数据库并写入数据: ```lua local mysql = require "luasql.mysql" -- 连接到 MySQL 数据库 local env = assert(mysql.mysql()) local conn = assert(env:connect("database_name", "username", "password", "host", port)) -- 写入数据 local query = [[ INSERT INTO table_name (column1, column2, column3) VALUES (?, ?, ?) ]] local stmt = assert(conn:prepare(query)) assert(stmt:execute("value1", "value2", "value3")) -- 关闭连接 stmt:close() conn:close() env:close() ``` 其中,`database_name` 是您要连接的数据库名称,`username` 和 `password` 分别是您的 MySQL 用户名和密码,`host` 是 MySQL 主机名或 IP 地址,`port` 是 MySQL 端口号,通常为 3306。 在 `query` 变量中,您可以编写要执行的 SQL 查询语句。在这里,我们使用了参数化查询来避免 SQL 注入攻击。`stmt:execute()` 方法用于执行 SQL 查询,并将要写入的数据作为参数传递给查询语句。 最后,您需要关闭连接,以释放资源。 注意:在实际应用中,您应该对写入的数据进行验证和过滤,以确保数据的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_小生有礼了_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值