目录

  1. 什么是 Lua 数据库访问
  2. 为什么要使用数据库访问
  3. Lua 数据库访问的方式
  4. 代码示例
  1. 常用数据库库
  2. 工作原理详解
  3. 优点与应用场景
  4. 常见问题与注意事项
  5. 参考资料与出站链接

什么是 Lua 数据库访问

Lua 数据库访问是指通过 Lua 脚本连接和操作数据库(如 SQLite、MySQL 等)的过程。Lua 本身没有内置数据库支持,需借助第三方库(如 LuaSQL)实现连接、查询和数据操作。


为什么要使用数据库访问

  • 数据持久化:将数据存储到数据库中。
  • 高效查询:利用数据库的索引和 SQL。
  • 动态性:脚本中处理运行时数据。
  • 跨平台:结合 Lua 的轻量性访问多种数据库。

Lua 数据库访问的方式

  • LuaSQL:最常用的数据库绑定库,支持 SQLite、MySQL、PostgreSQL 等。
  • 其他库
  • lua-mysql:专注于 MySQL。
  • lsqlite3:专为 SQLite 设计。
  • 安装:通过 LuaRocks 或手动编译安装数据库库。

代码示例

使用 LuaSQL 访问 SQLite

安装 LuaSQL-SQLite

luarocks install luasql-sqlite3

示例代码

-- 加载 LuaSQL SQLite 模块
local luasql = require "luasql.sqlite3"

-- 创建环境和连接
local env = assert(luasql.sqlite3())
local conn = assert(env:connect("test.db"))

-- 创建表
conn:execute[[CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)]]

-- 插入数据
conn:execute[[INSERT INTO users (name, age) VALUES ('张三', 25)]]
conn:execute[[INSERT INTO users (name, age) VALUES ('李四', 30)]]

-- 查询数据
local cursor = assert(conn:execute("SELECT * FROM users"))
local row = cursor:fetch({}, "a")  -- 关联数组形式
while row do
    print(string.format("ID: %d, 姓名: %s, 年龄: %d", row.id, row.name, row.age))
    row = cursor:fetch(row, "a")
end

-- 关闭连接
cursor:close()
conn:close()
env:close()

运行结果:

ID: 1, 姓名: 张三, 年龄: 25
ID: 2, 姓名: 李四, 年龄: 30

使用 LuaSQL 访问 MySQL

安装 LuaSQL-MySQL

luarocks install luasql-mysql

示例代码

-- 加载 LuaSQL MySQL 模块
local luasql = require "luasql.mysql"

-- 创建环境和连接
local env = assert(luasql.mysql())
local conn = assert(env:connect("testdb", "username", "password", "localhost", 3306))

-- 创建表
conn:execute[[CREATE TABLE IF NOT EXISTS employees (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), salary DECIMAL(10,2))]]

-- 插入数据
conn:execute[[INSERT INTO employees (name, salary) VALUES ('王五', 5000.00)]]

-- 查询数据
local cursor = assert(conn:execute("SELECT * FROM employees"))
local row = cursor:fetch({}, "a")
while row do
    print(string.format("ID: %d, 姓名: %s, 薪资: %.2f", row.id, row.name, row.salary))
    row = cursor:fetch(row, "a")
end

-- 关闭连接
cursor:close()
conn:close()
env:close()

运行结果(假设已有数据):

ID: 1, 姓名: 王五, 薪资: 5000.00

常用数据库库

库名支持数据库特点
LuaSQLSQLite, MySQL, PostgreSQL通用性强,社区支持好
lsqlite3SQLite轻量,专为 SQLite 优化
lua-mysqlMySQL专注于 MySQL,简单易用
resty.mysqlMySQLOpenResty 环境下的高性能驱动

工作原理详解

  • 连接:通过 C 绑定调用数据库客户端库。
  • 执行:SQL 语句传递给数据库引擎,返回结果集。
  • 游标:结果以迭代器形式返回,逐行读取。
  • 关闭:释放连接和资源。

优点与应用场景

优点

  • 轻量:Lua 与数据库结合占用资源少。
  • 灵活:动态脚本操作数据库。
  • 跨平台:支持多种数据库类型。

应用场景

  • 游戏开发:存储玩家数据。
  • Web 应用:配合 Nginx 处理数据库请求。
  • 脚本工具:批量处理数据。

常见问题与注意事项

  1. 库安装
  • 确保 LuaRocks 和数据库开发头文件已安装(如 libsqlite3-dev)。
  1. 连接失败
  • 检查主机名、端口、用户名和密码。
  1. SQL 注入
  • 使用参数化查询避免注入:
   conn:execute("INSERT INTO users (name) VALUES (?)", "张三")
  1. 资源管理
  • 总是关闭游标和连接,避免泄漏。
  1. 错误处理
  • assertpcall 捕获异常。

参考资料与出站链接

  1. 官方文档
  1. 学习资源
  1. 工具支持

如果您需要更复杂的数据库示例(如事务处理或连接池),请告诉我,我会进一步扩展!