對於簡單的資料操作,可使用檔案處理。但有時,這些檔案操作可能效率不高,可延伸且功能強大。 為此經常需要使用資料庫。 LuaSQL是一個從Lua到許多資料庫管理系統的簡單介面。 LuaSQL是一個庫,它為不同型別的SQL提供支援。 包括 -
在本教學中,將介紹在Lua中如何使用MySQL和SQLite資料庫操作處理。它為兩者使用通用介面,並且也可以將此實現移植到其他型別的資料庫。 首先來看看如何在MySQL中進行操作。
要使以下範例按預期工作,需要初始資料庫安裝設定。 假設如下 -
root
,密碼為:123456
。假設Lua實現正確完成,使用一個簡單的require
語句來匯入sqlite
庫。
mysql = require "luasql.mysql"
變數mysql
將通過參照主mysql錶來提供對函式的存取。
通過啟動MySQL環境,然後為環境建立連線。 如下所示 -
local env = mysql.mysql()
local conn = env:connect('test','root','123456')
上述連線將連線到現有的MySQL檔案,並與新建立的檔案建立連線。
連線提供了一個簡單的執行函式,可以幫助我們執行建立,插入,刪除,更新等操作完成所有資料庫操作。 語法如下所示 -
conn:execute([[ 'MySQLSTATEMENT' ]])
在上面的語法中,需要確保conn
是開啟的,以及MySQL連線成功,並用正確的SQL語句替換'MySQLSTATEMENT'
。
建立表範例
下面顯示了一個簡單的create table
範例。 它建立一個表,其中包含兩個欄位引數: id
型別為integer
,name
型別為varchar
。
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的insert
語句如下所示-
conn:execute([[INSERT INTO sample values('11','Maxsu')]])
更新語句範例
MySQL的更新語句如下所示 -
conn:execute([[UPDATE sample3 SET name='Yiibai' where id ='12']])
刪除語句範例
MySQL的刪除語句如下所示 -
conn:execute([[DELETE from sample3 where id ='12']])
選擇語句範例
就select
語句而言,我們需要迴圈遍歷每一行並提取所需的資料。一個簡單的選擇語句如下所示 -
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
語句返回的游標的幫助下,可以遍歷表響應並獲取所需的選擇資料。
下面給出了包括所有上述語句的完整範例 -
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','Maxsu')]])
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: Maxsu
事務是一種確保資料一致性的機制。事務具有以下四個屬性 -
事務以START TRANSACTION
開始; 並以commit
或rollback
語句結束。
開始事務
要啟動事務,需要在Lua中執行以下語句,假設conn
是一個開啟的MySQL連線。
conn:execute([[START TRANSACTION;]])
回滾事務
需要執行以下語句來回滾執行啟動事務後所做的更改。
conn:execute([[ROLLBACK;]])
提交事務
需要執行以下語句來提交啟動事務執行後所做的更改。
conn:execute([[COMMIT;]])
在上面和後面的章節中已經了解了MySQL的基本SQL操作。 記住事務,雖然這裡沒有為SQLite3解釋,但同樣的語句也適用於SQLite3。