教程 > lua 教程 > 阅读:78

lua 数据库访问——迹忆客-ag捕鱼王app官网

对于简单的数据操作,我们可能会使用文件,但有时,这些文件操作可能并不高效、可扩展和强大。 为此,我们可能经常切换到使用数据库。 luasql 是从 lua 到许多数据库管理系统的简单接口。luasql 是一个库,它为不同类型的 sql 提供支持。 这包括,

  • sqlite
  • mysql
  • odbc

在本教程中,我们将介绍 lua 中 mysql 和 sqlite 的数据库处理。 这对两者都使用了通用接口,并且应该可以将此实现移植到其他类型的数据库。 首先让我们看看如何在 mysql 中进行操作。


mysql 数据库设置

为了使用以下示例按预期工作,我们需要初始数据库设置。 下面列出了这些假设。

  • 我们已经安装并设置了 mysql,默认用户为 root,密码为“123456”。
  • 我们已经创建了一个数据库测试。
  • 我们已通过 mysql 教程了解 mysql 基础知识

导入 mysql

假设我们的 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 连接,并将“mysqlstatement”替换为正确的语句。

创建表示例

一个简单的创建表示例如下所示。 它创建一个表,其中有两个参数 id 类型为 integername 类型为 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 的表,其中包含两列,即 idname

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 的插入语句如下所示。

conn:execute([[insert into sample values('11','raj')]])

更新语句示例

mysql 的更新语句如下所示。

conn:execute([[update sample3 set name='john' 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','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

执行事务

事务是一种确保数据一致性的机制。 事务应具有以下四个属性

  • 原子性 - 事务完成或根本没有发生任何事情。
  • 一致性 - 事务必须以一致的状态开始,并使系统处于一致的状态。
  • 隔离 - 交易的中间结果在当前交易之外不可见。
  • durability - 一旦提交事务,即使在系统故障之后,效果也是持久的。

事务以 start transaction 开始; 并以提交或回滚语句结束。

开启事务

为了发起事务,我们需要在 lua 中执行以下语句,假设 conn 是一个开放的 mysql 连接。

conn:execute([[start transaction;]])

回滚事务

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

conn:execute([[rollback;]])

提交事务

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

conn:execute([[commit;]])

我们在上面已经了解了 mysql,下面的部分解释了基本的 sql 操作。 记住事务,虽然没有对 sqlite3 再次解释,但同样的语句也应该适用于 sqlite3。


导入 sqlite

假设我们的 lua 实现正确完成,我们可以使用简单的 require 语句来导入 sqlite 库。 在安装过程中,包含数据库相关文件的文件夹 libsql。

sqlite3 = require "luasql.sqlite3"

变量 sqlite3 将通过引用主 sqlite3 表来提供对函数的访问。


设置连接

我们可以通过启动 sqlite 环境然后为该环境创建连接来设置连接。 如下所示。

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

上述连接将连接到现有的 sqlite 文件或创建新的 sqlite 文件并与新创建的文件建立连接。


执行函数

连接有一个简单的执行功能,可以帮助我们执行所有的数据库操作,包括创建、插入、删除、更新等。 语法如下所示

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

在上述语法中,我们需要确保 conn 已打开且存在 sqlite3 连接,并将“sqlite3statement”替换为正确的语句。

完整示例

一个简单的创建表示例如下所示。 它创建一个表,其中有两个参数 id 类型为 integername 类型为 varchar

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 的表,其中包含两列,即 idname

sqlite3 environment (003ec918) sqlite3 connection (00421f08)
0 nil

如果发生错误,我们将返回错误语句而不是 nil。 一个简单的错误语句如下所示。

luasql: unrecognized token: ""'id' integer, 'name' text)"

插入语句示例

sqlite 的插入语句如下所示。

conn:execute([[insert into sample values('11','raj')]])

选择语句示例

就 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 连接。 借助 execute 语句返回的游标,我们可以遍历表响应并获取所需的选择数据。

完整示例

下面给出了一个包含上述所有语句的完整示例。

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 库的帮助下执行所有可用的查询。 所以,请不要停留在这些例子上。 在 lua 中分别试验 mysql、sqlite3 和其他支持的数据库中可用的各种查询语句。

查看笔记

扫码一下
查看教程更方便
网站地图