我试图通过mysql代理使用LuaSql连接到mysql服务器。我尝试执行一个简单的程序(db.lua):
require("luasql.mysql")
local _sqlEnv = assert(luasql.mysql())
local _con = nil
function read_auth(auth)
local host, port = string.match(proxy.backends[1].address, "(.*):(.*)")
_con = assert(_sqlEnv:connect( "db_name", "username", "password", "hostname", "3306"))
end
function disconnect_client()
assert(_con:close())
end
function read_query(packet)
local cur = con:execute("select * from t1")
myTable = {}
row = cur:fetch(myTable, "a")
print(myTable.id,myTable.user)
end
当我在没有mysql-proxy
的情况下执行它时,此代码执行良好。当我连接mysql-proxy时,错误日志会显示以下错误:
mysql.lua:8:错误的参数#1到'insert'(表预期,得到nil) db.lua:1:循环或上一个错误加载模块'luasql.mysql'
mysql.lua是LuaSql的默认文件:
---------------------------------------------------------------------
-- MySQL specific tests and configurations.
-- $Id: mysql.lua,v 1.4 2006/01/25 20:28:30 tomas Exp $
---------------------------------------------------------------------
QUERYING_STRING_TYPE_NAME = "binary(65535)"
table.insert (CUR_METHODS, "numrows")
table.insert (EXTENSIONS, numrows)
---------------------------------------------------------------------
-- Build SQL command to create the test table.
---------------------------------------------------------------------
local _define_table = define_table
function define_table (n)
return _define_table(n) .. " TYPE = InnoDB;"
end
---------------------------------------------------------------------
-- MySQL versions 4.0.x do not implement rollback.
---------------------------------------------------------------------
local _rollback = rollback
function rollback ()
if luasql._MYSQLVERSION and string.sub(luasql._MYSQLVERSION, 1, 3) == "4.0" then
io.write("skipping rollback test (mysql version 4.0.x)")
return
else
_rollback ()
end
end
答案 0 :(得分:1)
正如我之前的评论中所述,错误表明table.insert (CUR_METHODS, ...)
在第一个arg中获得了nil。由于第一个arg是CUR_METHODS
,这意味着此对象CUR_METHODS
尚未定义。由于这发生在luasql.mysql
模块的顶部附近,我的猜测是luasql
初始化不完整,可能是因为找不到mysql DLL。我的猜测是LUA_CPATH
没有为luasql找到MySQL DLL,但是我很惊讶你不会得到包错误,所以奇怪的事情正在发生。您必须深入了解luasql
模块和C文件,以找出未创建它的原因。
更新:或者,更新帖子以显示mysql-proxy脚本中print("LUA path:", package.path)
和print("LUA path:", package.cpath)
的输出,并显示安装luasql的文件夹的路径以及该文件夹的内容。