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 

安装方式用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中的几个参数
lua数据库链接--mysql完整实现和luasql驱动API说明_第1张图片

lua数据库链接--mysql完整实现和luasql驱动API说明_第2张图片

默认配置文件是安装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

安装完毕,进行测试
lua数据库链接--mysql完整实现和luasql驱动API说明_第3张图片

如上图所示,在没有安装好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

你可能感兴趣的:(数据库,lua,面向对象)