Обсуждение статьи "SQLite: нативная работа с базами данных на SQL в MQL5" - страница 9

 

Maxim Kuznetsov #:

SQLite заточен под один поток или один писатель и много читателей. Много писателей не про него, про это другие базы которые не "лайт"

это безотносительно MQL - вот просто так оно и есть на самом деле и везде

И это ещё одна причина, по которой хотелось бы увидеть работу с PostgreSQL.

 
JRandomTrader #:

И это ещё одна причина, по которой хотелось бы увидеть работу с PostgreSQL.

так сделайте, в чём проблема ? DLL разрешите и пользуйтесь

не пользователь PostgreSQL, но MySQL,MonetDB, SQL Relay и ODBC использовал из mt5.

Когда есть потребность, проще и быстрее сделать самому, чем ждать милостей от природы

 
Maxim Kuznetsov #:

при этом скорость запросов упадёт, а требования по памяти увеличатся...

а так всё Ок :-) 

SQLite заточен под один поток или один писатель и много читателей. Много писателей не про него, про это другие базы которые не "лайт"

это безотносительно MQL - вот просто так оно и есть на самом деле и везде

Возможно Вы не умеете готовить SQLite, в ней нет узких мест, а именно таких как единый сервер TCP, который разруливает все поступающие потоки, этот сервер есть во всех остальных базах данных...

SQLite это подарок, если ее правильно приготовить, то скорость запросов на запись будет выше чем у Redis, а про чтение само собой, при этом когда вы читаете из базы потоки друг друга не блокируют и все происходит максимально быстро упираясь в ваши ресурсы системы, также вам дается возможность разворачивать БД в оперативной памяти при этом не важно каким образом, при создании, а можно через специальное ПО создать диск в оперативной памяти и на нем разместить БД и создать символическую ссылку, если например использовать для советников, что обеспечит наивысочайшую скорость доступа, конечно тоже самое можно сделать и в других БД, но это не будет иметь смысла, так как у них есть узкое место, а именно их TCP сервер, даже NOSQL база Redis не сможет дать вам той скорости, которую дает SQLite при правильной настройке.

И возможно вы не понимаете зачем нужен шаринг кэша в SQLite..., он необходим для экономии ресурсов памяти для ввода вывода, чтобы советники и скрипты по итогу потребляли меньше памяти и только, так как для их работы выделяется отдельный поток, для индикаторов отдельный поток не выделяется.

Когда используется режим общего кэша, соединение с базой открывается на весь процесс, а не на отдельные потоки, что экономит ресурсы, но как следствие приводит к подобным ошибкам, которые я описал выше и общий кэш замедляет работу базы.

Решение разработчиков MQL c одной стороны мне понятно, но с другой не очень, так как я имею большой опыт работы с платформой и не встречал случаев, чтобы кто либо запускал более 200 потоков одновременно, во 1 в терминале ограничение на 100 графиков, следовательно можно к каждому прикрепить по 1 советнику и по 1 скрипту, но можно также ещё запускать сервисы по кол-ву сервисов думаю ограничения нет, но это как минимум не удобно и ресурсозатратно в любом случае, а если бы эти потоки открывали свои собственные соединения с БД это капля в море по памяти относительно той, что уже выделили для запуска...

Такое использование терминала, как минимум неудобно, а как максимум не имеет смысла, так как грамотный разработчик сделает мультивалютного советника в виде одного потока, а не будет заниматься подобной ерундой.

Уважаемые разработчики, пожалуйста уберите общий кэш или тыкните меня носов в то что я упустил.

Вырвал суть про "SQLite Shared-Cache" из официальной документации:

"This can significantly reduce the quantity of memory and IO required by the system."

Вот ссылка, почитайте.

 

В MetaEditor эти кнопки (кроме Выполнить) для работы с базой данных пока не работают?


Всегда заблокированы.

 

Этот запрос ничего не возвращает:

PRAGMA foreign_keys;

 Попытка включить FOREIGN KEY не даёт результата:

    string query = "PRAGMA foreign_keys=ON;";
    if(!DatabaseExecute(m_db_handle, query)) {
      Print(__FUNCTION__, " > Query failed with code: ", GetLastError());
    }

В документации есть такая информация: https://www.sqlite.org/foreignkeys.html#fk_enable

Tip: If the command "PRAGMA foreign_keys" returns no data instead of a single row containing "0" or "1", then the version of SQLite you are using does not support foreign keys (either because it is older than 3.6.19 or

because it was compiled with SQLITE_OMIT_FOREIGN_KEY or SQLITE_OMIT_TRIGGER defined).

SQLITE_OMIT_TRIGGER

Defining this option omits support for TRIGGER objects. Neither the CREATE TRIGGER or DROP TRIGGER commands are available in this case, and attempting to execute either will result in a parse error. This option also disables enforcement of foreign key constraints, since the code that implements triggers and which is omitted by this option is also used to implement foreign key actions.

SQLITE_OMIT_FOREIGN_KEY

If this option is defined, then foreign key constraint syntax is not recognized.


С версией всё в порядке:

//---

Как включить FOREIGN KEY ?

 
Anatoli Kazharski #:

Этот запрос ничего не возвращает:

 Попытка включить FOREIGN KEY не даёт результата:

В документации есть такая информация: https://www.sqlite.org/foreignkeys.html#fk_enable


С версией всё в порядке:

//---

Как включить FOREIGN KEY ?

FOREIGN KEY включен по умолчанию, ключи запрета SQLITE_OMIT_FOREIGN_KEY или SQLITE_OMIT_TRIGGER мы не используем.

PRAGMA foreign_keys=ON; использовать не надо.


Для проверки работоспособности можно взять пример https://www.sqlite.org/foreignkeys.html

CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
);

CREATE TABLE track(
  trackid     INTEGER, 
  trackname   TEXT, 
  trackartist INTEGER,
  FOREIGN KEY(trackartist) REFERENCES artist(artistid)
);

При работе в редакторе все срабатывает правильно без ошибок.

 
Renat Fatkhullin #:

FOREIGN KEY включен по умолчанию, ключи запрета SQLITE_OMIT_FOREIGN_KEY или SQLITE_OMIT_TRIGGER мы не используем.

PRAGMA foreign_keys=ON; использовать не надо.


Для проверки работоспособности можно взять пример https://www.sqlite.org/foreignkeys.html

При работе в редакторе все срабатывает правильно без ошибок.

Спасибо за ответ!

У меня почему-то результат не тот, который ожидаю:

//---

Где ошибка?

И вот с этим тоже хочется разобраться:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Обсуждение статьи "SQLite: нативная работа с базами данных на SQL в MQL5"

Anatoli Kazharski, 2022.10.05 01:54

В MetaEditor эти кнопки (кроме Выполнить) для работы с базой данных пока не работают?


Всегда заблокированы.

 

Просьба, кому-нибудь воспроизвести и у себя пример выше.

Последняя строка в таблице track (выделена) не должна добавляться. 

 

Протестировал ту же схему в SQLiteStudio и всё работает правильно.

Вот такое должно быть предупреждение при попытке добавить строку с ID, которого нет в родительской таблице:


 
Спасибо, проверим.