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資料庫訪問的世界。記住,熟能生巧,所以不要害怕嘗試這些示例。也許你們會創造出下一個大型的數據庫驅動應用程序!快樂編程!

Credits: Image by storyset