luasql模塊支持sqlite3,可以完成最基本的數據庫功能,不過官方文檔上寫得不是很詳細。掃了下源代碼,外加實驗了下,得出了點經驗。
環境
Windows XP,LuaForWindows
代碼
require"luasql.sqlite3"
function enumSimpleTable(t)
print"-------------------"
fork,v in pairs(t) do
print(k, " = ", v)
end
print"-------------------\n"
end
function rows(cur)
returnfunction(cur)
localt = {}
if(nil~= cur:fetch(t, 'a')) then return t
elsereturn nil end
end,cur
end
env = assert(luasql.sqlite3())
db =assert(env:connect("test.db"))
db:setautocommit(false)
res = assert(db:execute [[CREATE TABLEpeople(name text, sex text)]])
res = assert(db:execute [[INSERT INTOpeople VALUES('程序猿','男')]])
res = assert(db:execute [[INSERT INTOpeople VALUES('程序猿老婆', '女')]])
assert(db:commit())
res = assert(db:execute [[SELECT * FROMpeople]])
colnames = res:getcolnames()
coltypes = res:getcoltypes()
enumSimpleTable(colnames)
enumSimpleTable(coltypes)
for r in rows(res) do
enumSimpleTable(r)
end
res:close()
db:close()
env:close()
結論
environment對象(數據庫驅動)
構造
env = luasql.sqlite3()
成員
close()
關閉環境。請先關閉所有connection對象。
connection對象(數據庫連接)
構造
con = env:connect(sqlite3_database_file_path)
- env:環境
- sqlite3_database_file_path:數據庫路徑字符串
- con:數據庫連接對象
成員
res = execute(sql_statement)
執行sql語句
- sql_statement:要執行的sql語句,一般用[[sql]]的字符串形式,因為sql語句中常含有引號等特殊字符
- res:
- 對於不返回記錄集的sql語句(如CREATE,DELETE),res是一個數字,表示操作影響了多少記錄。
- 對於返回記錄集的sql語句(如SELECT),res是一個cursor對象(記錄集)
setautocommit(bAuto)
- bAuto
- 設置為true時,rollback當前事務,並忽略錯誤
- 設置為false時,開始一個新的事務
commit()
提交事務
rollback()
回滾事務
close()
關閉數據庫連接,請先關閉所有的cursor對象
rowed = getlastautoid()
獲取最近一次自動生成的sqlite的rowid字段值(對應sqlite3_last_insert_rowid())
cursor對象
構造
con:execute(select_sql_statement)
成員
colnametable = getcolnames()
以table形式返回記錄集中每一列的列名
coltypetable = getcoltypes()
以table形式返回記錄集中每一列的類型
res = fetch([table[,modestring]])
獲取下一個記錄集
- table:如果指定了table,則會將數據復制到table中
- modestring:可取值”n”或”a”,默認為”n”,
- “n”:table中的key是數字
- “a”:table中的key是字符串(列名)
- res:如果未指定table,則返回記錄,如果指定了table,則返回修改后的table;如果沒有下一記錄了,則返回nil
close()
關閉cursor對象