Lua - 数据库访问

你好,有抱负的程序员们!今天,我们将踏上一段激动人心的旅程,探索使用Lua进行数据库访问的世界。作为你友好的计算机科学老师,我将在这一冒险中一步步引导你。如果你是编程新手,不用担心——我们将从基础开始,逐步提升。所以,戴上你的虚拟安全帽,让我们一起挖掘一些数据!

Lua - Database Access

MySQL 数据库设置

在我们开始在Lua中玩转数据库之前,我们需要设置我们的游乐场。把它想象成在烹饪美味大餐前准备你的厨房。在我们的例子中,我们将使用MySQL作为我们的数据库管理系统。

  1. 首先,确保你的计算机上安装了MySQL。如果没有,请访问MySQL网站并下载适合你操作系统的适当版本。

  2. 安装完成后,为我们的实验创建一个新的数据库。你可以使用MySQL命令行或像MySQL Workbench这样的图形工具来完成此操作。

CREATE DATABASE lua_test;

太棒了!现在我们的沙盒已经准备好进行一些Lua魔法。

导入MySQL

要在Lua中使用MySQL,我们需要一个名为LuaSQL的特殊工具。它就像一个翻译,帮助Lua与MySQL对话。让我们导入它:

local luasql = require "luasql.mysql"

这行代码就像告诉Lua:“嘿,这个任务我们需要你的MySQL技能!”

设置连接

既然我们已经向Lua介绍了MySQL,让我们建立一个连接。这就像拨打一个电话号码来连接到我们的数据库:

local env = luasql.mysql()
local con = env:connect("lua_test", "username", "password", "localhost", 3306)

以下是发生的事情:

  • 我们为MySQL创建一个环境(env)。
  • 我们使用这个环境来连接到我们的数据库,提供数据库名、用户名、密码、主机和端口。

执行函数

执行函数是我们向数据库发送命令的方式。这就像在餐厅里点餐的服务员:

function execute(con, sql)
local cur = con:execute(sql)
if cur then
return cur:fetch()
end
return nil
end

这个函数接收我们的连接和一个SQL命令,执行它,并返回结果。

创建表示例

让我们创建我们的第一个表!想象我们正在构建一个简单的图书馆系统:

local sql = [[
CREATE TABLE books (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100),
author VARCHAR(50),
year INT
)
]]
execute(con, sql)

这会创建一个名为 'books' 的表,其中包含id、title、author和year列。

插入语句示例

现在,让我们向我们的图书馆添加一些书籍:

local sql = [[
INSERT INTO books (title, author, year)
VALUES ('The Lua Programming Language', 'Roberto Ierusalimschy', 2016)
]]
execute(con, sql)

这会将一本书添加到我们的表中。就像为新书填写图书馆卡片。

更新语句示例

哎呀!我们犯了一个错误。让我们更新我们书籍的年份:

local sql = [[
UPDATE books
SET year = 2017
WHERE title = 'The Lua Programming Language'
]]
execute(con, sql)

这将纠正我们书籍的出版年份。

删除语句示例

让我们从我们的图书馆中移除一本书:

local sql = [[
DELETE FROM books
WHERE title = 'The Lua Programming Language'
]]
execute(con, sql)

这将从我们的表中删除指定的书籍。

选择语句示例

现在,让我们看看我们的图书馆里有哪些书:

local sql = "SELECT * FROM books"
local cur = con:execute(sql)
local row = cur:fetch({}, "a")
while row do
print(string.format("%s by %s (%d)", row.title, row.author, row.year))
row = cur:fetch(row, "a")
end

这将检索所有书籍并打印它们的详细信息。

完整示例

让我们把所有东西放在一起形成一个完整的示例:

local luasql = require "luasql.mysql"

local env = luasql.mysql()
local con = env:connect("lua_test", "username", "password", "localhost", 3306)

function execute(con, sql)
local cur = con:execute(sql)
if cur then
return cur:fetch()
end
return nil
end

-- 创建表
execute(con, [[
CREATE TABLE IF NOT EXISTS books (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100),
author VARCHAR(50),
year INT
)
]])

-- 插入一本书
execute(con, [[
INSERT INTO books (title, author, year)
VALUES ('The Lua Programming Language', 'Roberto Ierusalimschy', 2017)
]])

-- 选择并打印所有书籍
local cur = con:execute("SELECT * FROM books")
local row = cur:fetch({}, "a")
while row do
print(string.format("%s by %s (%d)", row.title, row.author, row.year))
row = cur:fetch(row, "a")
end

con:close()
env:close()

这个脚本创建一个表,插入一本书,然后打印表中的所有书籍。

执行事务

事务就像一系列数据库操作的保护罩。它们确保要么所有操作都成功,要么一个都不成功。这是一种“要么全部,要么没有”的方法。

开始事务

要开始一个事务:

con:execute("START TRANSACTION")

回滚事务

如果出了问题,我们可以撤销所有更改:

con:execute("ROLLBACK")

提交事务

如果一切顺利,我们可以保存所有更改:

con:execute("COMMIT")

导入SQLite

SQLite是另一种流行的数据库系统,特别适用于较小的应用程序。让我们看看如何与Lua一起使用它:

local luasql = require "luasql.sqlite3"

设置连接

连接到SQLite与MySQL有所不同:

local env = luasql.sqlite3()
local con = env:connect("test.db")

这会创建或打开一个名为 "test.db" 的文件作为我们的数据库。

执行函数

SQLite的执行函数与MySQL相似:

function execute(con, sql)
local cur = con:execute(sql)
if cur then
return cur:fetch()
end
return nil
end

创建表示例

让我们在SQLite中创建一个简单的表:

local sql = [[
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
age INTEGER
)
]]
execute(con, sql)

插入语句示例

现在,让我们添加一个用户:

local sql = [[
INSERT INTO users (name, age)
VALUES ('Alice', 30)
]]
execute(con, sql)

选择语句示例

让我们检索我们的用户:

local sql = "SELECT * FROM users"
local cur = con:execute(sql)
local row = cur:fetch({}, "a")
while row do
print(string.format("%s is %d years old", row.name, row.age))
row = cur:fetch(row, "a")
end

完整示例

这里是一个使用SQLite的完整示例:

local luasql = require "luasql.sqlite3"

local env = luasql.sqlite3()
local con = env:connect("test.db")

function execute(con, sql)
local cur = con:execute(sql)
if cur then
return cur:fetch()
end
return nil
end

-- 创建表
execute(con, [[
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
age INTEGER
)
]])

-- 插入一个用户
execute(con, [[
INSERT INTO users (name, age)
VALUES ('Alice', 30)
]])

-- 选择并打印所有用户
local cur = con:execute("SELECT * FROM users")
local row = cur:fetch({}, "a")
while row do
print(string.format("%s is %d years old", row.name, row.age))
row = cur:fetch(row, "a")
end

con:close()
env:close()

这个脚本创建一个表,插入一个用户,然后打印表中的所有用户。

就是这样,伙计们!你已经迈出了使用Lua进行数据库访问的第一步。记住,熟能生巧,所以不要害怕用这些示例进行实验。谁知道呢?你可能会创造出下一个大型数据库驱动的应用程序!快乐编码!

方法 描述
require "luasql.mysql" 导入MySQL模块
env:connect() 建立数据库连接
con:execute() 执行SQL语句
cur:fetch() 获取结果行
START TRANSACTION 开始事务
ROLLBACK 撤销事务中的更改
COMMIT 保存事务中的更改
require "luasql.sqlite3" 导入SQLite模块

Credits: Image by storyset