Lua - 数据库访问
你好,有抱负的程序员们!今天,我们将踏上一段激动人心的旅程,探索使用Lua进行数据库访问的世界。作为你友好的计算机科学老师,我将在这一冒险中一步步引导你。如果你是编程新手,不用担心——我们将从基础开始,逐步提升。所以,戴上你的虚拟安全帽,让我们一起挖掘一些数据!
MySQL 数据库设置
在我们开始在Lua中玩转数据库之前,我们需要设置我们的游乐场。把它想象成在烹饪美味大餐前准备你的厨房。在我们的例子中,我们将使用MySQL作为我们的数据库管理系统。
-
首先,确保你的计算机上安装了MySQL。如果没有,请访问MySQL网站并下载适合你操作系统的适当版本。
-
安装完成后,为我们的实验创建一个新的数据库。你可以使用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