Lua 数据库访问
本文主要為大家介紹 Lua 數(shù)據(jù)庫的操作庫:LuaSQL。他是開源的,支持的數(shù)據(jù)庫有:ODBC, ADO, Oracle, MySQL, SQLite 和 PostgreSQL。
本文為大家介紹MySQL的數(shù)據(jù)庫連接。
LuaSQL 可以使用?LuaRocks?來安裝可以根據(jù)需要安裝你需要的數(shù)據(jù)庫驅(qū)動(dòng)。
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ū)動(dòng):
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)境對(duì)象 env = luasql.mysql()--連接數(shù)據(jù)庫 conn = env:connect("數(shù)據(jù)庫名","用戶名","密碼","IP地址",端口)--設(shè)置數(shù)據(jù)庫的編碼格式 conn:execute"SET NAMES UTF8"--執(zhí)行數(shù)據(jù)庫操作 cur = conn:execute("select * from role")row = cur:fetch({},"a")--文件對(duì)象的創(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)閉文件對(duì)象 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"=====================以上是原文,下面寫一點(diǎn)自己的實(shí)戰(zhàn)中的收獲==========================
1.安裝luaforwindows應(yīng)該包含了安裝LuaSQL,實(shí)戰(zhàn)中只安裝了前者沒有安裝后者,可以成功操作數(shù)據(jù)庫
2.引入庫的時(shí)候使用require "luasql.mysql" 或者使用luasql = require "luasql.mysql"都正確(發(fā)現(xiàn)自己的環(huán)境是lua5.1,原文說5.2以上的必須更改,實(shí)際情況待測(cè))
3.row = cur:fetch({},"a") 中的a是什么意思?沒有領(lǐng)悟
4.上面代碼中row.id和row.name中id和name代表實(shí)際數(shù)據(jù)庫中的字段名字
5.執(zhí)行事務(wù):
事務(wù)是確保數(shù)據(jù)一致性的機(jī)制。事務(wù)應(yīng)該具有以下四個(gè)特性:
- ??? 原子性:事務(wù)要么都完成或都沒有任何變化發(fā)生。
- ??? 一致性:事務(wù)必須啟動(dòng)一個(gè)一致的狀態(tài),讓系統(tǒng)處于一致的狀態(tài)。
- ??? 隔離:一個(gè)事務(wù)的中間結(jié)果是不是當(dāng)前事務(wù)外可見。
- ??? 持久性:當(dāng)一個(gè)事務(wù)被提交,這個(gè)效果是持久的,即使在系統(tǒng)出現(xiàn)故障。
事務(wù)開始START TRANSACTION;和commit或rollback語句結(jié)束。
開始事務(wù)
為了啟動(dòng)一個(gè)事務(wù),我們需要執(zhí)行在Lua下面執(zhí)行語句,假設(shè)conn是一個(gè)開放的MySQL連接。
代碼如下:
conn:execute([[START TRANSACTION;]])回滾事務(wù)
我們需要做執(zhí)行下面的語句來回滾執(zhí)行開始事務(wù)后所做的更改。
代碼如下:
conn:execute([[ROLLBACK;]])提交事務(wù)
我們需要做執(zhí)行以下語句提交執(zhí)行開始事務(wù)后所做的更改。
代碼如下:
conn:execute([[COMMIT;]])我們已經(jīng)在上面知道關(guān)于MySQL和下節(jié)介紹基本的SQL操作。請(qǐng)記住事務(wù),但sqlite3不會(huì)再解釋了,但相同的語句在sqlite3也能正常工作。
?
實(shí)測(cè)代碼如下(正常運(yùn)行):
require "luasql.mysql" --luasql = require "luasql.mysql"--創(chuàng)建環(huán)境對(duì)象 env = luasql.mysql()--連接數(shù)據(jù)庫 conn = env:connect("msdb","root","root","192.168.0.108",3306)--設(shè)置數(shù)據(jù)庫的編碼格式 conn:execute"SET NAMES GB2312"--執(zhí)行數(shù)據(jù)庫操作 cur = conn:execute("select * from action_log")row = cur:fetch({},"a")--文件對(duì)象的創(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)閉文件對(duì)象 conn:close() --關(guān)閉數(shù)據(jù)庫連接 env:close() --關(guān)閉數(shù)據(jù)庫環(huán)境運(yùn)行結(jié)果:
?
總結(jié)
- 上一篇: lua语言学习总结
- 下一篇: Mysql游标循环遍历