Lua MySQL操作

對於簡單的數據操作,可使用檔處理。但有時,這些檔操作可能效率不高,可擴展且功能強大。 為此經常需要使用資料庫。 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檔,並與新創建的檔建立連接。

執行函數

連接提供了一個簡單的執行函數,可以幫助我們執行創建,插入,刪除,更新等操作完成所有資料庫操作。 語法如下所示 -

conn:execute([[ 'MySQLSTATEMENT' ]])

在上面的語法中,需要確保conn是打開的,以及MySQL連接成功,並用正確的SQL語句替換'MySQLSTATEMENT'

創建表示例

下麵顯示了一個簡單的create table示例。 它創建一個表,其中包含兩個字段參數: id類型為integername類型為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的表,其中包含兩列,即idname

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='zaixian' 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開始; 並以commitrollback語句結束。

開始事務

要啟動事務,需要在Lua中執行以下語句,假設conn是一個打開的MySQL連接。

conn:execute([[START TRANSACTION;]])

回滾事務

需要執行以下語句來回滾執行啟動事務後所做的更改。

conn:execute([[ROLLBACK;]])

提交事務

需要執行以下語句來提交啟動事務執行後所做的更改。

conn:execute([[COMMIT;]])

在上面和後面的章節中已經瞭解了MySQL的基本SQL操作。 記住事務,雖然這裏沒有為SQLite3解釋,但同樣的語句也適用於SQLite3。


上一篇: Lua Web編程 下一篇: Lua遊戲編程