lua數據庫鏈接--mysql完整實現和luasql驅動API說明

本文介紹lua的luasql驅動庫,這個luasql是開源的,支持很多數據庫,如:mysql/odbc/postgres/sqlite/sqlite3/oracle

下面分win和linux兩個來介紹,操作過後覺得linux相對複雜一些

win:win7 64位
linux:centos6.5 32位

win7環境
win7的主要是參考“菜鳥網絡”的指導進行,LuaSQL 可以使用 LuaRocks 來安裝可以根據需要安裝你需要的數據庫驅動,下載地址
https://github.com/keplerproject/luarocks/wiki/Installation-instructions-for-Windows
我的lua是5.1.5,安裝的是這個版本LuaForWindows_v5.1.5-51.exe,後面即使我們luarocks刪除了,也可以使用luasql.mysql模塊,所以不能確定是否一定要安裝luarocks。如果您瞭解,請留言,謝謝!

通過luarocks安裝不同的lua數據庫驅動模塊

luarocks install luasql-sqlite3
luarocks install luasql-postgres
luarocks install luasql-mysql
luarocks install luasql-sqlite
luarocks install luasql-odbc

測試驗證luasql.mysql是否ok,在lua cmd中敲入:require “luasql.mysql”,如果沒有報錯證明模塊安裝正常,可以使用。

Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
>require "luasql.mysql"

linux
centos6.5中自帶有lua版本,版本是5.1.4,本章描述的luasql模塊是2.1.1;lua版本過低,建議升級到5.1.5,下載鏈接如下:
lua5.1.5地址: http://www.lua.org/ftp/lua-5.1.5.tar.gz
luasql2.1.1地址:
http://files.luaforge.net/releases/luasql/luasql/LuaSQL2.1.1/luasql-2.1.1.tar.gz
下載過後,執行解壓,解壓命令爲tar -zxvf xxx.tar.gz,進入到解壓後的文件夾下。
注意: 如果linux是虛擬的,請在系統目錄下解壓,不要再共享目錄解壓,如果解壓過程中涉及到創建軟鏈接會失敗。

lua-5.1.5的安裝
先安裝lua-5.1.5,安裝命令,安裝之前請先安裝libreadline-dev依賴包,否則會報如下錯誤
“lua.c:80:31: fatal error: readline/readline.h: No such file or directory ”

make[1]: Entering directory `/root/lua/lua-5.1.5/src'
make all SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl -lreadline"
make[2]: Entering directory `/root/lua/lua-5.1.5/src'
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX -c -o lua.o lua.c
lua.c:80:31: fatal error: readline/readline.h: No such file or directory
 #include <readline/readline.h>

安裝方式用yum,命令爲yum install readline-devel,再執行lua的編譯和安裝指令。
#make linux
#make install

安裝完畢後,建議先安裝mysql組件,否則會包錯誤“no file :mysql.h”,缺少mysql的頭文件和相關動態庫文件,安裝完整的mysql開發包,建議先用yum search mysql查找一下,安裝devel的開發版本。
下面是我的centos系統對應的版本,請不要照搬

yum -y install mysql-devel.i686

luasql的安裝
進入到解壓後的luasql-2.1.1中,需要修改conf中的幾個參數
這裏寫圖片描述

這裏寫圖片描述

默認配置文件是安裝sqlite3的,我們需要將sqlite3的註釋掉,修改爲mysql的,去掉T= mysql前面的註釋,註釋掉T= sqlite3;針對本機上mysql的安裝路徑信息修改以下信息:DRIVER_LIBS= -L/usr/lib/mysql -lmysqlclient -lz
DRIVER_INCS= -I/usr/include/mysql,可通過whereis mysql查看mysql的安裝路徑信息,註釋掉sqlite3的對應信息。

還需要在WARN= -Wall -Wmissing-prototypes -Wmissing-declarations -ansi -pedantic 後面增加-Wno-long-long,否則會上報錯誤

ISO C90 not support ‘long long

然後執行luasql-2.1.1的安裝,執行指令

make 
make install

安裝完畢,進行測試
這裏寫圖片描述

如上圖所示,在沒有安裝好luasql.mysql模塊之前操作失敗,安裝完成後,執行成功無錯誤。

附上簡單的示例,要運行這段代碼,需要有mysql服務器,並創建好名爲“luatest”的數據庫

require "luasql.mysql" --加載mysql驅動庫

env = luasql.mysql(); --創建環境對象
conn = env:connect("luatest", "root", "123456", "10.11.12.13", 3306);
--conn:execute"SET NAMES UTF8"
print(env, conn);

status, errorString = conn:execute([[CREATE TABLE sample2 (id INTEGER, name TEXT)]]);
print(status, errorString);

status, errorString = conn:execute([[INSERT INTO sample2 values('12', 'tony')]]);
print(status, errorString);

cursor, errorString = conn:execute("select * from sample2");
print(cursor, errorString);

print(cursor:numrows());

row = cursor:fetch({}, "a");
while row do
   print(string.format("Id: %s, Name: %s", row.id, row.name));
   row = cursor:fetch(row, "a");
end

cursor:close();
conn:close();
env:close();

針對主要的幾個函數,對照luasql的英文手冊來說明。

1.Drivers
luasql包含多種數據庫的驅動庫,鏈接數據庫之前需要加載對應的驅動庫,允許加載多種驅動庫。驅動庫名字並不是完全對應數據庫名字,比如orcale的驅動庫名字爲oci8,而不是orcale。還有一點,有些驅動庫,比如mysql,如果存在多個版本的mysql,lua是不支持加載多版本的mysql驅動庫,一次只允許一種版本的操作。

require "luasql.mysql" --加載一種數據庫驅動卡
--加載多種數據庫驅動庫
require "luasql.mysql"
require "luasql.odbc"
require "luasql.oci8"

附上英文參考手冊內容:

 **Drivers**
A LuaSQL driver allows the use of the LuaSQL API with a database 
management system that corresponds to the driver. To use a driver you 
have to load it in the luasql table. The example below
require "luasql.odbc"

loads the ODBC driver in the luasql table. Note that you can have more 
than onedriver loaded at the same time doing something like:
require "luasql.odbc"
require "luasql.oci8"

This example also shows that the driver name not always correspond to the 
Database name, but to the driver name in the file system. Since it refers 
to the OCI8 API, the Oracle driver has the name oci8 instead of oracle.

Some drivers, such as the MySQL, have libraries for a number of database 
versions that use the same file name (mysql). In this case it is not 
possible to load more than one version of the MySQL driver in the luasql 
table

2.Environment Objects
環境對象,從luasql的table中返回一個實例化的環境對象,實現方法是調用與驅動庫同名的初始化函數,

env1 = lusql.mysql() -- myql數據庫的環境對象
env2 = lusql.odbc()  -- odbc數據庫的環境對象

env相關函數
注:api描述的方法,“[]”裏面的參數是可選參數

env:connect(sourcename[,options...])--[[options的參數不定--]]
--連接不同的數據庫,參數不同。
--Returns: a connection object

--mysql的參數定義爲
env:connect("databasename", "username", "passwd", "ip", "port")
env:close() --[[關閉環境對象--]]
-- 成功return true,失敗返回false,重複關閉會返回失敗false.
--只有當依賴於它的connection object和cursor object已關閉時,纔可以關閉env

此外,sqlite有幾個獨有函數,env.version()/env.memory()/env.quotestr(string)

Connection Objects
connection對象,包含特定屬性和參數的單數據鏈接,通過調用env:connection()返回對象實例

--[[方法 --]]
conn:close()--無參數,關閉connection,要求與之關聯的cursor對象先關閉
            --否則關閉失敗,重複關閉也會返回失敗;關閉成功返回true

conn:commit(["DEFERRED" | "IMMEDIATE" | "EXCLUSIVE"])
--委託當前事務,僅在支持事務管理的數據庫中具有此功能,如sqlite。

conn:execute(statement [,timeout])
--執行給定的sql語句statement,timeout應該是某些數據庫的特有參數,
--參考手冊中註明了sqlite,通過測試發現mysql是不支持加timeout的
--timeout 單位毫秒級milliseconds,可選參數,當數據庫忙是等待超時

conn:rollback(["DEFERRED" | "IMMEDIATE" | "EXCLUSIVE"])
--回滾操作,回滾當前事務,同樣屬於特定函數,只有支持事務操作的數據庫有效

conn:setautocommit(*)
--參數比較多,另起一行,*的參數如下
[boolean] [,"DEFERRED" | "IMMEDIATE" | "EXCLUSIVE"] [,timeout]
--特有“事務操作”函數,關閉或者打開autocommit功能。

還有些特定數據庫的專有函數,這裏只列出不解釋
--ODBC extensions
conn:tables()

--SQLite extensions
conn:lastid()
conn:setbusytimeout(millisecs)
conn:tables()
conn:prepare(statement)
conn:openblob(table, column, rowid [,update])
conn:zeroblob(table, column, rowid, size)

connection 常用的函數是execute和close

cursor object

--[[cursor object--]]
--A cursor object contains methods to retrieve data resulting 
--from an executed statement
--cursor對象包含一些函數,這些函數可以獲取執行sql語句得到的數據結果;
--cursor對象是執行conn:execute和conn:prepare返回值

cur:close()--關閉cur,重複關閉報false,成功返回true

cur:fetch([table[,modestring]])
--獲取下一行數據。
--[[如果fetch無參數調用,直接返回的數據表;如果是帶table的參數,
則數據會先拷貝到table中,然後返回此table數據表,modestring有兩種模式,
“n”返回結果中是數字索引,默認模式,“a”返回結果中是數字和字符的混雜模式。
n模式是select語句獲取fields的index位置,a模式是這些field的名字
"重點強調一下, table參數一定是保存一下一row的數據,自身完成迭代"。
--]]

cur:getcolnames()
--無參數,返回column 名字

cur:getcoltypes()
--無參數,返回column 類型

SQLite extensions
cur:bind({ {type,value},... })

BLOB Objects
--[[二進制大對象,由於之前沒有接觸過數據庫,所以我是第一次接觸這個定義,
BLOB,binary large object,二進制大對象,是一個可以存儲二進制文件的容器,
大型對象
BLOB就是使用二進制保存數據。
如:保存位圖
可以理解爲,我們自定義了一種類型,類型是有許多個二進制組織,我們將這些
二進制一起作爲一個對象對待,不關心具體每個二進制處理是如何處理的,處理的
最小單位就是這個blob.具體與編程語言如何對應,待學習!
此外還有clob的概念。
--]]

blob:close()
blob:read(size,offset)
blob:write(string, offset)

blob百度鏈接
https://baike.baidu.com/item/blob/543419?fr=aladdin

原版luasql的英文手冊,請參考鏈接
http://blog.csdn.net/yuliying/article/details/11716995

官方luasql的參考手冊鏈接
http://realtimelogic.com/ba/doc/en/lua/luasql.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章