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