Ошибка: неверный аргумент # 1 для ‘insert’ (ожидаемая таблица, получено nil)

#mysql #lua #mysql-proxy #luasql

#mysql #lua #mysql-прокси #luasql

Вопрос:

Я пытаюсь подключиться к серверу 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
  

Комментарии:

1. Что это значит: «подключение с помощью mysql-proxy»? Это модуль? Скрипт? Как вы это используете?

2. @Schollii это скрипт lua (db.lua), который я указываю в моем файле mysql-proxy.cnf прокси mysql. Я использую его через прокси mysql для доступа к серверу mysql с mysql-proxy.. Я ясно выразился?

3. Основываясь на документах mysql-proxy и опубликованном вами коде, я предполагаю, что вы пытаетесь создать скрипт mysql-proxy, а не подключаться к серверу mys1l через прокси mysql. В таком случае, что вы подразумеваете под «выполняется хорошо, когда я выполняю их без myql-proxy». Ошибка, которую вы получаете, означает, что прокси не создает таблицу CUR_METHODS. Что заставляет вас думать, что создание подключения к БД из прокси разрешено?

4. @Schollii Что я имею в виду под «хорошо выполняется, когда я выполняю их без myql-proxy», так это то, что я могу подключиться к базе данных mysql с помощью LuaSQL, но я не могу подключить то же самое с mysql-proxy. Возможно ли подключить сервер mysql через mysql-proxy? P.S: Теперь я внес некоторые изменения в code..So пожалуйста, проверьте это сейчас

5. @Schollii у меня также есть другое сомнение, возможно ли использовать скрипт luasql через прокси mysql?

Ответ №1:

Как указано в моем предыдущем комментарии, ошибка указывает на то, что table.insert (CUR_METHODS, ...) в качестве первого аргумента получает nil. Поскольку первым аргументом является CUR_METHODS , это означает, что этот объект CUR_METHODS еще не определен. Поскольку это происходит в верхней части luasql.mysql модуля, я предполагаю, что luasql инициализация была неполной, возможно, потому, что библиотека DLL mysql не была найдена. Я предполагаю, что LUA_CPATH не находит MySQL DLL для luasql, но я удивлен, что вы не получили ошибку пакета, так что происходит что-то странное. Вам придется покопаться в luasql модуле и файле C, чтобы выяснить, почему он не создается.

Обновление: альтернативно, обновите свой post, чтобы показать выходные данные print("LUA path:", package.path) и print("LUA path:", package.cpath) из вашего скрипта mysql-proxy, а также показать путь к папке, где установлен luasql, и содержимое этой папки.

Комментарии:

1. но mysql.so присутствует в определенном. Я указал этот путь в mysql-proxy.cnf для LUA_CPATH. Но все та же ошибка.

2. @robin вы приняли этот ответ, но ваш последний комментарий указывает на все еще проблему, можете ли вы уточнить, каков фактический статус?

3. состояние таково, что та же ошибка сохраняется даже после изменения LUA_CPATH.

4. я понял, что фактическая ошибка заключается во включении правильного LUA_CPATH в конфигурационный файл mysql-proxy. Теперь это работает хорошо 🙂 Спасибо за вашу помощь.