Lua两种方式操作MySQL

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

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

原生预处理方式

  • 优点:高度自定义,方便处理复杂逻辑与数据
  • 缺点:不如语句构建器方案简单
Lua 复制代码
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语句
Lua 复制代码
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文件

Lua 复制代码
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;
相关推荐
野犬寒鸦3 小时前
MySQL索引使用规则详解:从设计到优化的完整指南
java·数据库·后端·sql·mysql
A尘埃5 小时前
K8S有状态服务部署(MySQL、Redis、ES、RabbitMQ、Nacos、ZipKin、Sentinel)
redis·mysql·kubernetes
吻等离子6 小时前
解决 MySQL 数据库无法远程连接的问题
数据库·mysql·adb
后院那片海6 小时前
MySQL数据库操作
数据库·mysql
杨云龙UP7 小时前
SQL Server 中的 GO 及其与其他数据库的对比
数据库·sql·mysql·oracle·sqlserver
Linux运维技术栈7 小时前
MySQL 8.0 单节点部署与一主两从架构搭建实战
数据库·mysql·架构
潜龙95278 小时前
第3.2.3节 Android动态调用链路的获取
android·调用链路
追随远方8 小时前
Android平台FFmpeg音视频开发深度指南
android·ffmpeg·音视频
撰卢10 小时前
MySQL 1366 - Incorrect string value:错误
android·数据库·mysql
恋猫de小郭10 小时前
Flutter 合并 ‘dot-shorthands‘ 语法糖,Dart 开始支持交叉编译
android·flutter·ios