之前由于skynet框架本身集成了mysql模块,因此没有碰到什么困难就完成了mysql功能的开发。这次由于没有采用skynet框架,因此在编译集成lua下的mysql时遇到了几个问题,记录下:
1. 用resty-mysql还是luamysql
这两个都是lua的mysql实现,用户接口操作也大同小异,主要区别在resty-mysql基于nginx开发,skynet把resty-mysql拿来修改了下,增加了lua 5.3的支持,去掉了nginx的依赖,改为skynet的socketChannel来实现。但是总体来说resty-mysql不独立,需要引入其他模块,因此被抛弃。选择了luamysql。
2. luamysql编译流程
(1)下载源代码
git clone https://github.com/keplerproject/luasql.git
(2) 编译
make
make install
PS:注意在make过程中可能会遇到lua.h/mysqlclient.so等路径不对的问题,通过config文件修改路径即可。
(3) 引入
make install以后luamysql会被cp到以下位置:
/usr/lib/lua/5.2/luasql/mysql.so
在lua中require需要通过修改LUA_CPATH来指定。这里可能会有个问题。下面详细说。
我一开始设置LUA_CPATH路径为下面这个路径:
export LUA_CPATH=/usr/lib/lua/5.2/luasql/?.so;
但是在lua中require中出现一个问题,
/usr/lib/lua/5.2/luasql/mysql.so: undefined symbol: luaopen_mysql
通过查询mysql.so的符号表得知:
0000000000002930 T luaopen_luasql_mysql
mysql只有这个symbol,因此LUA_CPATH的路径必须为以下地址:
export LUA_CPATH=/usr/lib/lua/5.2/?.so;
然后通过 require "luasql.mysql" 引入模块。