求知 文章 文库 Lib 视频 Code iProcess 课程 认证 咨询 工具 火云堂 讲座吧   成长之路  
会员   
要资料
 
追随技术信仰

随时听讲座
每天看新闻
 
 

Lua 教程
Lua开发环境
Lua基本语法
Lua变量
Lua数据类型
Lua运算符
Lua循环
Lua决策
Lua函数
Lua字符串
Lua数组
Lua迭代器
Lua表格
Lua模块
Lua元表
Lua协同程序
Lua文件I/O
Lua错误处理
Lua 高级教程
Lua调试
Lua垃圾收集
Lua面向对象
Lua Web编程
Lua数据库/MYSQL操作
Lua游戏编程
Lua标准库
 
 

Lua数据库/MySQL操作
65 次浏览
15次  
 捐助

对于简单的数据操作,我们可以使用文件,但是,有时候这些文件操作效率不高,可扩展性和强大不好。所以我们可能会经常切换到使用数据库。 LuaSQL是从Lua一些数据库管理系统的一个简单的接口。 LuaSQL它提供了对不同类型的SQL支持库。这包括:

SQLite

Mysql

ODBC

在本教程中,将涵盖Lua中的SQLite和MySQL数据库处理。使用这个通用接口为应尽可能实施于其它类型的数据库。首先,让我们看看如何在MySQL中执行操作。

MySQL数据库的设置

以使用下面的示例以预期方式工作,我们所需要的初始数据库设置。假设如下面列出:

已经安装并设置MySQL的默认用户以root,密码为“123456”。

您已经创建了一个数据库test。

您通过MySQL教程去了解MySQL基础知识。

导入MySQL

我们可以用一个简单语句导入SQLite库,假设Lua中正确实现并已完成。在安装过程中,文件夹libsql包含数据库相关的文件。

 mysql = require "luasql.mysql"

可变的MySQL将提供通过参照主MySQL表访问该功能。

建立连接

我们可以设立一个启动MySQL的环境,然后创建环境的连接。如下所示。

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

上面的连接将连接到现有的MySQL文件并建立与新创建的文件的连接。

执行函数

这将有助于我们做的创建,插入,删除,更新等,所有的数据库操作执行简单的功能。语法如下所示

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

在上面的语法,我们需要确保conn是开放的和现有的MySQL连接并替换“MySQLSTATEMENT”使用正确的语句。

创建表的例子

一个简单的创建表的示例如下所示。它创建类型为int和varchar类型,两个参数ID和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

Insert语句的例子

MySQL的INSERT语句如下所示。

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

Update语句的例子

对于MySQL UPDATE语句如下所示。

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

删除Delete 语句的例子

DELETE语句-MySQL如下所示。

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

Select语句的例子

就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语句结束。

开始事务

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

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

回滚事务

我们需要做执行下面的语句来回滚执行开始事务后所做的更改。

conn:execute([[ROLLBACK;]])

提交事务

我们需要做执行以下语句提交执行开始事务后所做的更改。

conn:execute([[COMMIT;]])

我们已经在上面知道关于MySQL和下节介绍基本的SQL操作。请记住事务,但sqlite3不会再解释了,但相同的语句在sqlite3也能正常工作。

SQLite导入

我们可以用一个简单语句导入SQLite库,假设Lua中正确实现并已完成。在安装过程中,文件夹libsql包含数据库相关的文件。

sqlite3 = require "luasql.sqlite3"

变量sqlite3将提供通过参照主sqlite3表访问该功能。

建立连接

我们成立了发起sqlite环境,然后创建环境的连接。它如下所示。

local env  = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')

上述连接将连接到现有的SQLite文件或创建一个新的源码文件,并建立与新创建的文件的连接。

执行函数

有可用的,这将有助于我们执行创建,插入,删除,更新等,所有的数据库操作基于连接执行简单的功能。语法如下所示

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

在上面的语法,我们需要确保conn是开放的及现有的sqlite3连接,代替“SQLite3STATEMENT”使用正确的语句。

创建表的例子

一个简单的创建表的示例如下所示。它创建类型为int和varchar类型,两个参数ID和name的表。

sqlite3 = require "luasql.sqlite3"
local env = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')
print(env,conn) status,errorString = conn:execute([[CREATE TABLE sample ('id' INTEGER, 'name' TEXT)]])
print(status,errorString )

当运行上面的程序,表名为sample将有两列分别是id和name会被创建。

SQLite3 environment (003EC918)	SQLite3 connection (00421F08)
0 nil

如果有错误,会返回nil的错误语句。下面一个简单的错误语句如下所示。

LuaSQL: unrecognized token: ""'id' INTEGER, 'name' TEXT)"

Insert语句的例子

SQLite的一个INSERT语句如下所示。

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

Select语句的例子

就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 是一个开放的sqlite3连接。在执行语句返回游标的帮助下,可以通过表的反应返回获取所需的选择数据。

一个完整的例子

所有上述声明一个完整的例子给出下面参考。

sqlite3 = require "luasql.sqlite3"
local env = sqlite3.sqlite3()
local conn = env:connect('mydb.sqlite')
print(env,conn) status,errorString = conn:execute([[CREATE TABLE sample ('id' INTEGER, 'name' TEXT)]])
print(status,errorString ) status,errorString = conn:execute([[INSERT INTO sample values('1','Raj')]])
print(status,errorString ) cursor,errorString = conn:execute([[select * from sample]])
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()

当运行上面的程序,会得到如下的输出。

SQLite3 environment (005EC918)	SQLite3 connection (005E77B0)
0 nil
1 nil
SQLite3 cursor (005E9200) nil
Id: 1, Name: Raj

我们可以用这个libsql库完成所有可用的查询。所以可以试验MySQL,SQLite3和其它Lua支持DB提供各种查询语句。


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



65 次浏览
15次
 捐助
 

每天2个文档/视频
扫描微信二维码订阅
订阅技术月刊
获得每月300个技术资源
 
 

关于我们 | 联系我们 | 京ICP备10020922号 京公海网安备110108001071号