luasql (проблема с cursor:fetch)

Страницы: 1
RSS
luasql (проблема с cursor:fetch)
 
Здравствуйте. Решил использовать luasql для работы с mysql. Столкнулся  с проблемой при извелечении данных  ("sel ect x fr om y ...."). При вызове cursor:fetch вылетает ошибка  "Unknown error. Possible external module error." Просто из-под lua все работает. Насколько я понимаю, проблема не новая, тут уже было обсуждение http://forum-archive.quik.ru/forum/lua/105223/105349/ (у меня ни первый вариант, ни второй не работает). Вопрос: можно ли обойти как-то эту ситуацию ?
 
Код
cursor, err = con:execute(sQuery)
Посмотрите сообщение об ошибке err
Надо делать так, как надо. А как не надо - делать не надо.
 
Да нет вроде никаких ошибок . Боле того, cur:numrows() возвращает корректное значение  
 
http://forum-archive.quik.ru/forum/lua/114488/114488/
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Дмитрий Сазонов пишет:
"Unknown error. Possible external module error."
Сообщение "Unknown error. Possible external module error."  говорит о том что луа не смогла поймать и распознать ошибку.
Это значит, что ошибка может быть абсолютно любой.
 
Цитата
Старатель пишет:
http://forum-archive.quik.ru/forum/lua/114488/114488/
Цитата
Старатель пишет:
http://forum-archive.quik.ru/forum/lua/114488/114488/
Спасибо, да помогло. Но теперь возникает непонятная ситуация: есть следующий скрипт. Он стабильно падает, причем если в обработчике обновления свечи "message(tostring(dataSource:T(index)), 1)" заменить ,например, на "message(tostring(dataSource :o (index)), 1)", то он падать перестает. Также? если убрать извлечение из БД в main-e, то тоже все нормально. Уже неделю не могу понять ,в чем проблема. Версия квика 6.15.2.9, mysql - 5.6.  Так же отмечу, если вообще в обработчике OnCandleUpdate делать какие-либо манипуляции с таблицей (lua-table), то падает аналогично. Может есть какие-то ограничение, где осуществлять подписку на обновление свечи?


mysql = require 'luasql.mysql'

SLEEP_PERIOD = 3000
CANDLE_PERIOD = INTERVAL_M5
INSTRUMENTS_CLASS = 'QJSIM'
CANDLE_TF_DELAY = 3

DB_NAME = 'test'
DB_LOGIN = 'root'
DB_PASSWORD = ''

dataSource = {}
isExecuting = false

function main()

local env  = mysql.mysql()
local connection = env:connect(DB_NAME, DB_LOGIN, DB_PASSWORD)

local query = string.format([[SEL ECT id FR OM test_table WHERE name = '%s']], 'hello')
local cursor, error = connection:execute(query)
if cursor ~= nil then
local rows = {[0] = ''}
local row = cursor:fetch (rows, "a")
message(tostring(row.id), 1)
cursor:close()
end


while isExecuting == true do  

sleep(SLEEP_PERIOD)

end

connection:close()
env:close()

end


function OnStop(flag)
isExecuting = false
end


function OnInit(path)
createDataSources(exportedInstruments)
isExecuting = true
end

function createDataSources(instruments)

dataSource = CreateDataSource(INSTRUMENTS_CLASS, 'LKOH', CANDLE_PERIOD)
if dataSource ~= nil then
dataSource:SetUpdateCallback(function(...) OnCandleUpdate(INSTRUMENTS_CLASS, 'LKOH', ...) end)
isExecuting = true
end

end

function OnCandleUpdate(class, security, index)

message(tostring(dataSource:T(index)), 1)

end
 
В общем обновился до 6.17.1.17, и вроде как проблема пропала.
 
Цитата
Старатель написал:
http://forum-archive.quik.ru/forum/lua/114488/114488/
У меня точно такая же проблема, но архивная ветка уже не доступна. Подскажите, пожалуйста, как лечится?  
 
Цитата
romirez написал:
Цитата
Старатель написал:
 http://forum-archive.quik.ru/forum/lua/114488/114488/  
У меня точно такая же проблема, но архивная ветка уже не доступна. Подскажите, пожалуйста, как лечится?  
Эксперименты показали, что проблема в параметре "a"  cur:fetch ({}, "a") когда в выборке более 1 поля. Для "n" ошибку не выдает
 
Никто не знает как сделать чтобы cur:fetch ({}, "a")   работало?
 
Какая версия QUIK?
 
Вервия 8.4.1.6   64-битное все
 
Я год назад, когда собрал версию для х64, тоже столкнулся с этим. Даже issue отправлял https://github.com/keplerproject/luasql/issues/115

Решение - перейти на итератор курсора.
Код
function SQL_Rows(connection, sql_statement)
 local cursor = assert(connection:execute (sql_statement))
 return function ()
  return cursor:fetch()
 end
end

Кстати, у Вас библиотека на х64 стабильно работает? Я бросил попытки еще в январе.
 
Цитата
Nikolay написал:
Кстати, у Вас библиотека на х64 стабильно работает? Я бросил попытки еще в январе.
Не могу пока сказать, я ток в начале пути)
А где ожидать еще подвох?
 
Цитата
Nikolay написал:
Я год назад, когда собрал версию для х64, тоже столкнулся с этим. Даже issue отправлял  https://github.com/keplerproject/luasql/issues/115

Решение - перейти на итератор курсора.
Код
   function   SQL_Rows (connection, sql_statement)
  local  cursor  =  assert(connection:execute (sql_statement))
  return   function  ()
   return  cursor:fetch()
  end 
 end   

Кстати, у Вас библиотека на х64 стабильно работает? Я бросил попытки еще в январе.
я пользовал для 8.4 lsqlite3 lua 5.1 x64.

никаких проблем.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru написал:
я пользовал для 8.4 lsqlite3 lua 5.1 x64.
Не хотелось бы базу данных менять, уж больно прикипел я к MySQL))
 
Собирали сами? У меня стабильно падала после некоторого времени.
Надо заново проверить, вдруг починили. Техподдержка Квика так и не ответила, по моему обращению.
 
Нет. Взял вот от сюда LuaForWindows_v5.1.5-52
Самое обидное, что проблема давнишняя, и судя по этой ветке у нее были какие-то решения -утерянные в архиве ((
 
Цитата
Nikolay написал:
Собирали сами? У меня стабильно падала после некоторого времени.
Надо заново проверить, вдруг починили. Техподдержка Квика так и не ответила, по моему обращению.
да, сам собрал.

если надо, пишите почтой, поделюсь.

если вдруг у кого то есть sqlite для 5.3 x64 - буду очень рад.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru написал:
если вдруг у кого то есть sqlite для 5.3 x64 - буду очень рад
По-хорошему там под 64 бита надо поправлять, много ворнингов вылезает, что пихают 64-битное в int. Но поглядел поверхностно - вроде пихают только индексы на стеке, ничего ужасного вроде не ожидается, попробуйте, коль не лень. Сам sqlite3 интегрирован в эту же длл, отдельно его добавлять не нужно.
 
Я собирал версию ODBC. Она универсальна. sqlite3 не очень люблю, т.к. блокировки транзакций на уровне базы. Правда она умеет in memory, что приятно.
 
Цитата
Но к сожалению ссылка http://forum-archive.quik.ru/forum/lua/114488/114488/ на архив с ответом больше не доступна.
Не поможете, вспомните.. как мой вопрос решается??
К сожалению, не помню про что это.
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Nikolay написал:
блокировки транзакций на уровне базы
C версии 3.7.0 появился режим журнала WAL, в котором, как утверждается, читатели БД и писатели в БД уже не мешают друг другу.

Цитата
Anton написал:
Сам sqlite3 интегрирован в эту же длл, отдельно его добавлять не нужно.
Если не сложно, можете сделать с отдельной sqlite3.dll, чтоб без проблем обновить можно было.
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
с отдельной sqlite3.dll
Не очень удачная конфигурация на мой взгляд, но ежли нужно, то вот.
 
Цитата
Anton написал:
Цитата
Старатель написал:
с отдельной sqlite3.dll
Не очень удачная конфигурация на мой взгляд, но ежли нужно, то  вот .
Старатель,

спасибо.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Это Антону спасибо!

Цитата
Anton написал:
Не очень удачная конфигурация на мой взгляд
Почему?
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
Почему?
У каждой длл свой рантайм, в одной длл он один общий. Это не просто две копии в каждой длл, они и работают каждая сама по себе, у каждой свое состояние. Работать оно будет, конечно, плюсов там нет, сям в общем все равно. Можно также вынести рантайм в одну общую длл, но придется еще и redistributable вместе с дллками распространять. С точки зрения как-то радикально обновить sqlite и оставить обертку как есть тоже сомнения, обертка все же затачивалась под конкретную версию, могут (в будущем) вылезти какие-нибудь несовместимости.
 
Перезалейте пожалуйста скомпилированные sqlite для 5.3, по старым ссылкам уже не качается
 
Сейчас не в том месте, в течение нескольких дней перезалью. До тех пор если только кто-то из скачавших поделится.
 
 Скомпилированные sqlite для 5.3 (64р.): https://cloud.mail.ru/public/ts3g/4PJofyayZ
 
Цитата
Старатель написал:
Цитата
Nikolay написал:
блокировки транзакций на уровне базы
C версии 3.7.0 появился режим журнала  WAL , в котором, как утверждается, читатели БД и писатели в БД уже не мешают друг другу.
Wow! Несмотря на то что 3.7.0 уже 10 лет только сейчас узнал PRAGMA journal_mode=WAL; наше все !!! Спс
 
Спасибо скачал библиотеки, положил в папку с Квиком, но при попытке подключить командой sqlite3 = require("lsqlite3"); ошибка:
error loading module 'lsqlite3' from file 'C:\QuikFinam\lsqlite3.dll':
Не найден указанный модуль.
Файл по указному в ошибке пути есть, что я делаю не правильно?
 
Цитата
Евгений написал:
Не найден указанный модуль.Файл по указному в ошибке пути есть, что я делаю не правильно?
Здравствуйте.

Я у себя проверил в QUIKе 8.8.4.3
---
local sqlite3 = require("lsqlite3")  ------  Подключение пакета работы с sqlite3  -----
  env_Parm = sqlite3.open ("C:\\OS_Quesha 8 Lua5.3\\Sqlite\\History1M.db")
  env_Parm: close ()
  message("env_Parm: close ()")
---
Пакет подключился нормально.
-----------------
1. Файлы: lsqlite3.dll и sqlite3.dll нужно пересылать в папку, в которой находится  info.exe.
2  Возможно, после скачивания файлов, вы не разблокировали файлы dll. Исполняемые файлы после скачивания часто блокируются системой.
Разблокировку файла можно выполнить, зайдя в свойства файла (у заблокированных файлов есть соответствующий флажок).
 
Спасибо за советы, но всё же не получилось. Переустановил Quik, файлы на своём месте, проверил блокировку. Та же ошибка. Откуда качаете дистрибутив Quik? Нужно ли что-то установить помимо самого квика?  
 
Цитата
Евгений написал:
Нужно ли что-то установить помимо самого квика?  
3. Для того чтобы нормально работали пакеты dll, в W10(64р), в папке C:\Windows\System32 и
в C:\Windows\SysWOW64 должны быть (в каждой из них) файлы:
msvcp140d.dll
msvcr120d.dll
ucrtbased.dll
vcruntime140d.dll
Иначе QLua может выдавать сообщение: Не существует модуль…….
Данные файлы могут быть восстановлены из архива Sys_dll_acad93f088cb2265dbf134f27e48aae058671f2f.zip скачанного
по ссылке https://cloud.mail.ru/public/489u/4PD8JcfKd

 
Цитата
TGB написал:
msvcp140d.dllmsvcr120d.dllucrtbased.dllvcruntime140d.dll
Эти файлы не должны конечному пользователю поставляться. Надо собирать в релизной конфигурации, если хотите, чтобы у кого-нибудь кроме вас тоже работало.

Евгений, подождите уж пару дней, доберусь до места и выложу.
 
Цитата
Anton написал:
Надо собирать в релизной конфигурации, если хотите, чтобы у кого-нибудь кроме вас тоже работало.
Замечание правильное. Спасибо.
 
Хорошо жду
 
  По ссылке https://cloud.mail.ru/public/ts3g/4PJofyayZ сейчас находятся релизные dll для sqlite 5.3
 
Цитата
TGB написал:
 По ссылке  https://cloud.mail.ru/public/ts3g/4PJofyayZ  сейчас находятся релизные dll для sqlite 5.3
Только рекомендация по использованию (... положите все в папку квик .... ) неправильная
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
С библиотеками msvcp140d.dllmsvcr120d.dllucrtbased.dllvcruntime140d.dll всё заработало, спасибо
 
Цитата
Евгений написал:
С библиотеками msvcp140d.dllmsvcr120d.dllucrtbased.dllvcruntime140d.dll всё заработало, спасибо
спасибо за улыбку в начале дня :)

рахметыч жги еще ... не отлынивай !
 
Цитата
Евгений написал:
Хорошо жду
Залил, как возможность появилась, качать здесь. Это вариант с двумя отдельными длл.
Страницы: 1
Читают тему
Наверх