对于简单的数据操作,可使用文件处理。但有时,这些文件操作可能效率不高,可扩展且功能强大。 为此经常需要使用数据库。 LuaSQL是一个从Lua到许多数据库管理系统的简单接口。 LuaSQL是一个库,它为不同类型的SQL提供支持。 包括 -
在本教程中,将介绍在Lua中如何使用MySQL和SQLite数据库操作处理。它为两者使用通用接口,并且也可以将此实现移植到其他类型的数据库。 首先来看看如何在MySQL中进行操作。
要使以下示例按预期工作,需要初始数据库安装设置。 假设如下 -
root
,密码为:123456
。假设Lua实现正确完成,使用一个简单的require
语句来导入sqlite
库。
mysql = require "luasql.mysql"
变量mysql
将通过引用主mysql表来提供对函数的访问。
通过启动MySQL环境,然后为环境创建连接。 如下所示 -
local env = mysql.mysql() local conn = env:connect('test','root','123456')
上述连接将连接到现有的MySQL文件,并与新创建的文件建立连接。
连接提供了一个简单的执行函数,可以帮助我们执行创建,插入,删除,更新等操作完成所有数据库操作。 语法如下所示 -
conn:execute([[ 'MySQLSTATEMENT' ]])
在上面的语法中,需要确保conn
是打开的,以及MySQL连接成功,并用正确的SQL语句替换'MySQLSTATEMENT'
。
创建表示例
下面显示了一个简单的create table
示例。 它创建一个表,其中包含两个字段参数: id
类型为integer
,name
类型为varchar
。
mysql = require "luasql.mysql" local env = mysql.mysql() local conn = env:connect('test','root','123456') print(env,conn) status,errorString = conn:execute([[CREATE TABLE sample2 (id INTEGER, name TEXT);]]) print(status,errorString )
运行上述程序时,将创建一个名为sample
的表,其中包含两列,即id
和name
。
MySQL environment (004BB178) MySQL connection (004BE3C8) 0 nil
如果语句有任何错误,将返回错误语句而不是nil
。 一个简单的错误声明如下所示 -
LuaSQL: Error executing query. MySQL: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"id INTEGER, name TEXT)' at line 1
插入语句示例
MySQL的insert
语句如下所示-
conn:execute([[INSERT INTO sample values('11','Maxsu')]])
更新语句示例
MySQL的更新语句如下所示 -
conn:execute([[UPDATE sample3 SET name='zyiz' where id ='12']])
删除语句示例
MySQL的删除语句如下所示 -
conn:execute([[DELETE from sample3 where id ='12']])
选择语句示例
就select
语句而言,我们需要循环遍历每一行并提取所需的数据。一个简单的选择语句如下所示 -
cursor,errorString = conn:execute([[select * from sample]]) row = cursor:fetch ({}, "a") while row do print(string.format("Id: %s, Name: %s", row.id, row.name)) -- reusing the table of results row = cursor:fetch (row, "a") end
在上面的代码中,conn
是一个打开的MySQL连接。 在execute
语句返回的游标的帮助下,可以遍历表响应并获取所需的选择数据。
下面给出了包括所有上述语句的完整示例 -
mysql = require "luasql.mysql" local env = mysql.mysql() local conn = env:connect('test','root','123456') print(env,conn) status,errorString = conn:execute([[CREATE TABLE sample3 (id INTEGER, name TEXT)]]) print(status,errorString ) status,errorString = conn:execute([[INSERT INTO sample3 values('12','Maxsu')]]) print(status,errorString ) cursor,errorString = conn:execute([[select * from sample3]]) print(cursor,errorString) row = cursor:fetch ({}, "a") while row do print(string.format("Id: %s, Name: %s", row.id, row.name)) row = cursor:fetch (row, "a") end -- close everything cursor:close() conn:close() env:close()
运行上述程序时,将获得以下输出 -
MySQL environment (0037B178) MySQL connection (0037EBA8) 0 nil 1 nil MySQL cursor (003778A8) nil Id: 12, Name: Maxsu
事务是一种确保数据一致性的机制。事务具有以下四个属性 -
事务以START TRANSACTION
开始; 并以commit
或rollback
语句结束。
开始事务
要启动事务,需要在Lua中执行以下语句,假设conn
是一个打开的MySQL连接。
conn:execute([[START TRANSACTION;]])
回滚事务
需要执行以下语句来回滚执行启动事务后所做的更改。
conn:execute([[ROLLBACK;]])
提交事务
需要执行以下语句来提交启动事务执行后所做的更改。
conn:execute([[COMMIT;]])
在上面和后面的章节中已经了解了MySQL的基本SQL操作。 记住事务,虽然这里没有为SQLite3解释,但同样的语句也适用于SQLite3。