目录
什么是 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
常用数据库库
库名 | 支持数据库 | 特点 |
---|---|---|
LuaSQL | SQLite, MySQL, PostgreSQL | 通用性强,社区支持好 |
lsqlite3 | SQLite | 轻量,专为 SQLite 优化 |
lua-mysql | MySQL | 专注于 MySQL,简单易用 |
resty.mysql | MySQL | OpenResty 环境下的高性能驱动 |
工作原理详解
- 连接:通过 C 绑定调用数据库客户端库。
- 执行:SQL 语句传递给数据库引擎,返回结果集。
- 游标:结果以迭代器形式返回,逐行读取。
- 关闭:释放连接和资源。
优点与应用场景
优点
- 轻量:Lua 与数据库结合占用资源少。
- 灵活:动态脚本操作数据库。
- 跨平台:支持多种数据库类型。
应用场景
- 游戏开发:存储玩家数据。
- Web 应用:配合 Nginx 处理数据库请求。
- 脚本工具:批量处理数据。
常见问题与注意事项
- 库安装:
- 确保 LuaRocks 和数据库开发头文件已安装(如
libsqlite3-dev
)。
- 连接失败:
- 检查主机名、端口、用户名和密码。
- SQL 注入:
- 使用参数化查询避免注入:
conn:execute("INSERT INTO users (name) VALUES (?)", "张三")
- 资源管理:
- 总是关闭游标和连接,避免泄漏。
- 错误处理:
- 用
assert
或pcall
捕获异常。
参考资料与出站链接
- 官方文档:
- 学习资源:
- LuaSQL GitHub(英文)
- CSDN – Lua 数据库操作(中文)
- 工具支持:
- LuaRocks:安装数据库库。
- ZeroBrane Studio:调试。
如果您需要更复杂的数据库示例(如事务处理或连接池),请告诉我,我会进一步扩展!
发表回复