错误:insert的第一个参数不正确(应该是一个表格,但实际传入的是nil)。

我正在尝试使用LuaSql通过mysql代理连接到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个错误的参数#(期望表,得到nil) db.lua:1:循环或先前的加载模块“luasql.mysql”

mysql.lua是LuaSql的默认文件:

---------------------------------------------------------------------
-- MySQL特定测试和配置。
-- $ 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)

---------------------------------------------------------------------
--构建用于创建测试表的SQL命令。
---------------------------------------------------------------------
local _define_table = define_table
function define_tablenreturn _define_tablen).. “ TYPE = InnoDB;”
end

---------------------------------------------------------------------
-- MySQL版本4.0.x不实现回滚。
---------------------------------------------------------------------
local _rollback = rollback
function rollback()
        if luasql._MYSQLVERSION and string.subluasql._MYSQLVERSION,1,3)==“4.0” then
                io.write(“跳过回滚测试(mysql版本4.0.x)”)
                返回
        else
                _rollback()
        end
end

点赞
用户869951
用户869951

如我之前的评论所述,错误表明table.insert (CUR_METHODS, ...)的第一个参数是nil。由于第一个参数是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的文件夹的路径和该文件夹的内容。

2014-07-19 14:58:26