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 和其他資料庫中提供的各種查詢語句。

廣告

© . All rights reserved.