开发学院

您的位置:首页>教程>正文

教程正文

Lua 操作数据库(MySQL)

Lua 操作数据库(MySQL)

  对于简单的数据操作,我们可以使用文件,但是,有时这些文件操作可能效率不高、可扩展性和功能不够强大。为此,我们通常会切换到数据库。LuaSQL提供从Lua到数据库管理系统的简单接口,它为不同类型的数据库提供支持,包括:SQLite\Mysql\ODBC.

  在本章中,我们将涉及在Lua中使用MySQL数据库。我们将使用通用接口,并且可以将此实现移植到其他类型的数据库。首先,让我们看看如何在MySQL中执行操作。

MySQL数据库设置

  为了使用下面的示例,我们需要初始化数据库设置。本教程的设置如下。

  已经安装了MySQL,默认用户为root和密码为123456。

  创建了一个数据库test。

导入MySQL库

  我们可以使用一个简单的语句来导入MySQL库,假设您的Lua实现是正确的。

mysql = require "luasql.mysql"

建立连接

  我们可以通过实例化一个MySQL对象来建立连接,然后为环境创建连接。它如下所示。

local env  = mysql.mysql()
local conn = env:connect('test','root','123456')

  上面的连接将建立与MySQL的连接。

execute函数

  有一个简单的execute函数,它将帮助我们从创建、插入、删除、更新等方面执行数据库操作。如下所示:

conn:execute([[ 'MySQLSTATEMENT' ]])

创建表示例

  下面显示一个简单的创建表示例。它创建一个表,其中包含两个参数:类型为integer的id和类型为text的name。

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

插入数据库实例

conn:execute([[INSERT INTO sample values('11','Raj')]])

更新数据库实例

conn:execute([[UPDATE sample3 SET name='John' where id ='12']])

删除数据库实例

conn:execute([[DELETE from sample3 where id ='12']])

Select数据实例

 在下面的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连接。在游标的帮助下,您可以循环表并获取所需的数据。

完整的实例

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','Raj')]])
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: Raj

执行事务

  事务是确保数据一致性的机制。交易应具有以下四项属性−

  原子性—要么一个事务完成,要么根本没有发生任何事情。

  一致性—事务必须从一致状态启动,并使系统处于一致状态。

  隔离-事务的中间结果在当前事务之外不可见。

  持久性—一旦发生事务,即使系统发生故障,其效果也是持久的。

  事务以START TRANSACTION开始;以commit或 rollback语句结束。

START TRANSACTION

  为了启动一个事务,我们需要在Lua中执行以下语句,假设conn是一个打开的MySQL连接。

conn:execute([[START TRANSACTION;]])

Rollback Transaction

  我们需要执行以下语句来在执行启动事务后的回滚更改。

conn:execute([[ROLLBACK;]])

Commit Transaction

  我们需要执行以下语句来提交整个事务。

conn:execute([[COMMIT;]])