Обсуждение статьи "SQLite: нативная работа с базами данных на SQL в MQL5" - страница 8
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
И вопрос №2:
Пытаюсь использовать функции ATTACH/DETACH, чтобы передать данные между БД встроенным механизмом SQLite, в результате ошибка транзакции 5601...
При выполнении этой же транзакции в SQLiteStudio, все отлично.
Это сделано специально или что-то не работает?
Добрый день, уважаемые разработчики!
Функция "DatabaseExport" никак не хочет работать...выдает ошибку 5601 (ошибка выполнения запроса, но запрос я не выполняю) когда указываю имя таблицы в параметрах,
а когда указываю SQL запрос, то ошибка 4022 (отмена выполнения программы), возможно ошибка внутри MQL функции, часть кода из моей библиотеки:
К сожалению, функция DatabaseExport так и не получила функционал по экспорту таблицы (хотя изначально этот функционал предполагался) и на текущий момент поддерживает только запросы.
По ошибке 4022, Вы получаете её при тестировании, если да, то в тестере имеется ограничение на размер файла экспорта - 1GB общий размер записанных на диск данных ?
И вопрос №2:
Пытаюсь использовать функции ATTACH/DETACH, чтобы передать данные между БД встроенным механизмом SQLite, в результате ошибка транзакции 5601...
При выполнении этой же транзакции в SQLiteStudio, все отлично.
Это сделано специально или что-то не работает?
К сожалению, функция DatabaseExport так и не получила функционал по экспорту таблицы (хотя изначально этот функционал предполагался) и на текущий момент поддерживает только запросы.
По ошибке 4022, Вы получаете её при тестировании, если да, то в тестере имеется ограничение на размер файла экспорта - 1GB общий размер записанных на диск данных ?
Ошибка 4022 появляется без тестера, если указать в функцию DatabaseExport запрос вместо имени таблицы.
Размер базы меньше 10 Мб, планировал использовать этот функционал для копирования данных из базы на диске в базу в памяти.Запрос должен работать, проверьте правильность путей
Спасибо, попробую иначе предоставить путь, но по факту в SQLiteStudio запрос по указанному пути работает, запрос я вывел в лог терминала, а затем скопировал и выполнил в SQLiteStudio без проблем.
О результате напишу.
Тест для многопоточной записи в БД, запускать несколько копий скрипта, каждую копию можно пометить параметром expert_id.
Всё правильно пишется:
Только сыпятся ошибки о блокировке:
Как быть? По идее должен быть механизм условной вставки записи без возврата ошибки.
Запрос должен работать, проверьте правильность путей
1. Проверил ATTACH DATABASE действительно работает!
Проблема была в следующем, я пытался присоединить к базе созданной в оперативной памяти, физическую базу в этом случае ATTACH DATABASE не работает, а если присоединяем оперативную базу к физической, то работает!
Мне этого вполне хватает для создания копии базы в оперативной памяти, что ускоряет вычисления))
2. Решил пойти дальше... и проверить ещё одну возможность, а именно:
ATTACH DATABASE 'file:memdb1?mode=memory&cache=shared' AS M;
По идеи база данных должна создаться в оперативной памяти и после закрытия потока перестать существовать, но поведение у нее иное...
Во 1 я могу к ней присоединиться из любой MQL5 программы, советник, индикатор, скрипт, сервис,
Во 2 данные в ней сохраняются навсегда, даже после перезагрузки остаются, уже подумал..., что может база создается физически, но поиском по имени *memdb1* ничего не нашлось
П.С. Возможно из-за того, что я создавал базу из индикатора, а он работает в общем потоке?
Так то это крутая фишка, но вот хотелось бы узнать останется ли она в терминале в следующих обновлениях и после моего сообщения об этом?:))
В этом случае можно без труда передавать большие объемы данных между программами, без проблем и задержек и не использовать глобальные переменные ограниченные по длине имени...
В таком исполнении удаляется, после завершения MQL5 программы:
ATTACH DATABASE ':memory:?cache=shared' AS M;
ATTACH DATABASE ':memory:' AS M;
Добрый день!
Вопрос к разработчикам MT, возможно ли отключить атрибут Shared у библиотеки SQLite, опытным путем в других проектах определил, что именно в этом причина ошибки: database error, database is locked.
Если обращение происходит из разных потоков к базе, то это все решается на уровне самой базы, а именно выполнив эти два запроса сразу после открытия базы:
1. PRAGMA journal_mode = WAL;
2. PRAGMA busy_timeout = 1000;
а вот ошибка локирования уйдет только после того, как базу сделать не Shared, запросами это сделать не получится.
Добрый день!
Вопрос к разработчикам MT, возможно ли отключить атрибут Shared у библиотеки SQLite, опытным путем в других проектах определил, что именно в этом причина ошибки: database error, database is locked.
Если обращение происходит из разных потоков к базе, то это все решается на уровне самой базы, а именно выполнив эти два запроса сразу после открытия базы:
1. PRAGMA journal_mode = WAL;
2. PRAGMA busy_timeout = 1000;
а вот ошибка локирования уйдет только после того, как базу сделать не Shared, запросами это сделать не получится.
при этом скорость запросов упадёт, а требования по памяти увеличатся...
а так всё Ок :-)
SQLite заточен под один поток или один писатель и много читателей. Много писателей не про него, про это другие базы которые не "лайт"
это безотносительно MQL - вот просто так оно и есть на самом деле и везде