【问题标题】:Error: bad argument #1 to 'insert' (table expected, got nil)错误:“插入”的参数 #1 错误(应为表,结果为零)
【发布时间】:2014-07-04 06:15:16
【问题描述】:

我正在尝试通过 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: 'insert' 的参数 #1 错误(应为表,结果为零) db.lua:1: loop or previous error loading module '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

【问题讨论】:

  • 这是什么意思:“与 mysql-proxy 连接”?这是一个模块吗?剧本?你是怎么用的?
  • @Schollii 这是我在 mysql 代理的 mysql-proxy.cnf 文件中指定的 lua 脚本(db.lua)。我通过 mysql 代理使用它从 mysql-proxy 访问 mysql 服务器。 .我清楚了吗?
  • 基于mysql-proxy docs 和您发布的代码,我猜您正在尝试编写mysql-proxy 脚本,而不是通过mysql 代理连接到mys1l 服务器。在那种情况下,“当我在没有 myql-proxy 的情况下执行它们时执行得很好”是什么意思。您得到的错误意味着代理没有创建 CUR_METHODS 表。是什么让您认为允许从代理内部创建数据库连接?
  • @Schollii 我的意思是“当我在没有 myql-proxy 的情况下执行它们时执行良好”是我可以使用 LuaSql 连接到 mysql 数据库,但我无法使用 mysql-proxy 连接相同的数据库。是可以通过 mysql-proxy 连接 mysql 服务器吗? P.S:现在我对代码做了一些更改..所以请现在检查一下
  • @Schollii 我还有一个疑问是否可以通过 mysql 代理使用 luasql 脚本?

标签: mysql lua mysql-proxy luasql


【解决方案1】:

正如我之前的评论中所述,错误表明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 的文件夹路径和该文件夹的内容。

【讨论】:

  • 但 mysql.so 存在于特定位置。我在 mysql-proxy.cnf 中为 LUA_CPATH 指定了该路径。但仍然是同样的错误。
  • @robin 你接受了这个答案,但你最后的评论表明仍然有问题,你能澄清一下实际状态吗?
  • 状态是修改了LUA_CPATH还是出现同样的错误。
  • 我明白了,实际的错误是在 mysql-proxy 配置文件中包含正确的 LUA_CPATH。它现在运行良好 :) 感谢您的帮助。
猜你喜欢
  • 2021-03-08
  • 2021-01-16
  • 2012-11-22
  • 2017-04-08
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
相关资源
最近更新 更多