Lua 数据库访问
本文主要為大家介紹 Lua 數(shù)據(jù)庫的操作庫:LuaSQL。他是開源的,支持的數(shù)據(jù)庫有:ODBC, ADO, Oracle, MySQL, SQLite 和 PostgreSQL。
本文為大家介紹MySQL的數(shù)據(jù)庫連接。
LuaSQL 可以使用?LuaRocks?來安裝可以根據(jù)需要安裝你需要的數(shù)據(jù)庫驅(qū)動。
LuaRocks 安裝方法:
$ wget http://luarocks.org/releases/luarocks-2.2.1.tar.gz $ tar zxpf luarocks-2.2.1.tar.gz $ cd luarocks-2.2.1 $ ./configure; sudo make bootstrap $ sudo luarocks install luasocket $ lua Lua 5.3.0 Copyright (C) 1994-2015 Lua.org, PUC-Rio > require "socket"Window 下安裝 LuaRocks:https://github.com/keplerproject/luarocks/wiki/Installation-instructions-for-Windows
安裝不同數(shù)據(jù)庫驅(qū)動:
luarocks install luasql-sqlite3 luarocks install luasql-postgres luarocks install luasql-mysql luarocks install luasql-sqlite luarocks install luasql-odbc你也可以使用源碼安裝方式,Lua Github 源碼地址:https://github.com/keplerproject/luasql
Lua 連接MySql 數(shù)據(jù)庫:
require "luasql.mysql"--創(chuàng)建環(huán)境對象 env = luasql.mysql()--連接數(shù)據(jù)庫 conn = env:connect("數(shù)據(jù)庫名","用戶名","密碼","IP地址",端口)--設置數(shù)據(jù)庫的編碼格式 conn:execute"SET NAMES UTF8"--執(zhí)行數(shù)據(jù)庫操作 cur = conn:execute("select * from role")row = cur:fetch({},"a")--文件對象的創(chuàng)建 file = io.open("role.txt","w+");while row dovar = string.format("%d %s\n", row.id, row.name)print(var)file:write(var)row = cur:fetch(row,"a") endfile:close() --關(guān)閉文件對象 conn:close() --關(guān)閉數(shù)據(jù)庫連接 env:close() --關(guān)閉數(shù)據(jù)庫環(huán)境?
1 篇筆記
???四重人格
??xm_***f@qq.com
5.2 版本之后,require 不再定義全局變量,需要保存其返回值。
require "luasql.mysql"需要寫成:
luasql = require "luasql.mysql"=====================以上是原文,下面寫一點自己的實戰(zhàn)中的收獲==========================
1.安裝luaforwindows應該包含了安裝LuaSQL,實戰(zhàn)中只安裝了前者沒有安裝后者,可以成功操作數(shù)據(jù)庫
2.引入庫的時候使用require "luasql.mysql" 或者使用luasql = require "luasql.mysql"都正確(發(fā)現(xiàn)自己的環(huán)境是lua5.1,原文說5.2以上的必須更改,實際情況待測)
3.row = cur:fetch({},"a") 中的a是什么意思?沒有領(lǐng)悟
4.上面代碼中row.id和row.name中id和name代表實際數(shù)據(jù)庫中的字段名字
5.執(zhí)行事務:
事務是確保數(shù)據(jù)一致性的機制。事務應該具有以下四個特性:
- ??? 原子性:事務要么都完成或都沒有任何變化發(fā)生。
- ??? 一致性:事務必須啟動一個一致的狀態(tài),讓系統(tǒng)處于一致的狀態(tài)。
- ??? 隔離:一個事務的中間結(jié)果是不是當前事務外可見。
- ??? 持久性:當一個事務被提交,這個效果是持久的,即使在系統(tǒng)出現(xiàn)故障。
事務開始START TRANSACTION;和commit或rollback語句結(jié)束。
開始事務
為了啟動一個事務,我們需要執(zhí)行在Lua下面執(zhí)行語句,假設conn是一個開放的MySQL連接。
代碼如下:
conn:execute([[START TRANSACTION;]])回滾事務
我們需要做執(zhí)行下面的語句來回滾執(zhí)行開始事務后所做的更改。
代碼如下:
conn:execute([[ROLLBACK;]])提交事務
我們需要做執(zhí)行以下語句提交執(zhí)行開始事務后所做的更改。
代碼如下:
conn:execute([[COMMIT;]])我們已經(jīng)在上面知道關(guān)于MySQL和下節(jié)介紹基本的SQL操作。請記住事務,但sqlite3不會再解釋了,但相同的語句在sqlite3也能正常工作。
?
實測代碼如下(正常運行):
require "luasql.mysql" --luasql = require "luasql.mysql"--創(chuàng)建環(huán)境對象 env = luasql.mysql()--連接數(shù)據(jù)庫 conn = env:connect("msdb","root","root","192.168.0.108",3306)--設置數(shù)據(jù)庫的編碼格式 conn:execute"SET NAMES GB2312"--執(zhí)行數(shù)據(jù)庫操作 cur = conn:execute("select * from action_log")row = cur:fetch({},"a")--文件對象的創(chuàng)建 file = io.open("role.txt","w+");while row dovar = string.format("%s %s %d %s\n", row.actiontime, row.user, row.type, row.info) -- 遍歷字段的值print(var)file:write(var)row = cur:fetch(row,"a") endfile:close() --關(guān)閉文件對象 conn:close() --關(guān)閉數(shù)據(jù)庫連接 env:close() --關(guān)閉數(shù)據(jù)庫環(huán)境運行結(jié)果:
?
總結(jié)
- 上一篇: lua语言学习总结
- 下一篇: Mysql游标循环遍历