- Lua 教程
- Lua - 首页
- Lua 基础
- Lua - 概述
- Lua - 环境
- Lua - 基本语法
- Lua - 注释
- Lua - 打印 Hello World
- Lua - 变量
- Lua - 数据类型
- Lua - 运算符
- Lua - 循环
- Lua - 决策
- Lua - 函数
- Lua - 日期和时间
- Lua 数组
- 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 - 快速指南
- Lua - 有用资源
- Lua - 讨论
Lua - 数据库访问
对于简单的數據操作,我们可以使用文件,但是,有时,这些文件操作可能效率不高、不可扩展且功能不强大。为此,我们可能经常切换到使用数据库。LuaSQL 是 Lua 到许多数据库管理系统的简单接口。LuaSQL 是库,它提供了对不同类型的 SQL 的支持。这包括:
SQLite
Mysql
ODBC
在本教程中,我们将介绍 Lua 中 MySQL 和 SQLite 的数据库处理。它对两者使用通用接口,并且应该可以将此实现移植到其他类型的数据库。首先让我们看看如何在 MySQL 中执行操作。
MySQL 数据库设置
为了使以下示例按预期工作,我们需要初始数据库设置。假设条件如下所示。
您已安装并设置了 MySQL,默认用户为 root,密码为“123456”。
您已创建了一个数据库 test。
您已阅读 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 文件并与新创建的文件建立连接。
执行函数
连接提供了一个简单的 execute 函数,它将帮助我们执行所有数据库操作,例如创建、插入、删除、更新等等。语法如下所示:
conn:execute([[ 'MySQLSTATEMENT' ]])
在上述语法中,我们需要确保 conn 已打开且是现有的 MySQL 连接,并将“MySQLSTATEMENT”替换为正确的语句。
示例 - 创建表
下面显示了一个简单的创建表示例。它创建一个表,其中包含两个参数:id 类型为整数,name 类型为 varchar。
main.lua
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 的插入语句。
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']])
示例 - 选择语句
就选择语句而言,我们需要遍历每一行并提取所需的数据。下面显示了一个简单的选择语句。
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 语句返回的游标,您可以遍历表响应并获取所需的选择数据。
完整示例
下面给出了一个包含所有上述语句的完整示例。
main.lua
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;]])
回滚事务
我们需要执行以下语句以回滚在执行 start transaction 之后所做的更改。
conn:execute([[ROLLBACK;]])
提交事务
我们需要执行以下语句以提交在执行 start transaction 之后所做的更改。
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 文件,并与新创建的文件建立连接。
执行函数
连接提供了一个简单的 execute 函数,它将帮助我们执行所有数据库操作,例如创建、插入、删除、更新等等。语法如下所示:
conn:execute([[ 'SQLite3STATEMENT' ]])
在上述语法中,我们需要确保 conn 已打开且是现有的 sqlite3 连接,并将“SQLite3STATEMENT”替换为正确的语句。
示例 - 创建表
下面显示了一个简单的创建表示例。它创建一个表,其中包含两个参数:id 类型为整数,name 类型为 varchar。
main.lua
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)"
示例 - 插入语句
下面显示了 SQLite 的插入语句。
conn:execute([[INSERT INTO sample values('11','Raj')]])
示例 - 选择语句
就选择语句而言,我们需要遍历每一行并提取所需的数据。下面显示了一个简单的选择语句。
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 语句返回的游标,您可以遍历表响应并获取所需的选择数据。
完整示例
下面给出了一个包含所有上述语句的完整示例。
main.lua
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 和其他数据库中提供的各种查询语句。