2014-07-04 47 views
-1

我想通过mysql代理连接到使用LuaSql的mysql服务器。我试图执行一个简单的程序(db.lua):错误:错误的参数#1到'插入'(表预期,得到零)

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'或以前的错误加载模块“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

这是什么意思:“与mysql-proxy连接”?这是一个模块吗?脚本?你如何使用它? – Schollii

+0

@Schollii它是一个lua脚本(db.lua),我在我的mysql-proxy.cnf文件中指定了mysql proxy.I通过mysql代理使用它从mysql-proxy访问mysql服务器..我清楚了吗? – robin

+0

根据[mysql-proxy文档](http://dev.mysql.com/doc/refman/5.0/en/mysql-proxy-scripting-read-query.html)和您发布的代码,我猜测您正在尝试编写mysql-proxy脚本,而不是通过mysql代理连接到mysll服务器。在那种情况下,你的意思是“当我在没有myql-proxy的情况下执行它们时执行得很好”。您收到的错误意味着代理不会创建CUR_METHODS表。是什么让你认为从代理内部创建数据库连接是允许的? – Schollii

回答

1

正如我在以前的评论指出,该错误表明table.insert (CUR_METHODS, ...)是得到一个零为第一个参。由于第一个参数是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的文件夹的路径以及该文件夹的内容。

+0

但mysql.so存在于特定的位置。我指定了mysql-proxy.cnf中LUA_CPATH.But的路径仍然是相同的错误。 – robin

+1

@robin你接受了这个答案,但你最后的评论表明问题仍然存在,你能澄清一下什么是实际状态吗? – Schollii

+0

状态是即使在更改LUA_CPATH之后也存在相同的错误。 – robin

相关问题