- Знакомство с принципами работы с базой данных в MQL5
- Основы SQL
- Структура (схема) таблиц: типы данных и ограничения
- Интеграция ООП (MQL5) и SQL: концепция ORM
- Создание, открытие и закрытие базы данных
- Выполнение запросов без привязки к данным MQL5
- Проверка существования таблицы в базе данных
- Подготовка запросов с привязкой: DatabasePrepare
- Удаление и сброс подготовленных запросов
- Привязка данных к параметрам запроса:DatabaseBind/Array
- Выполнение подготовленных запросов: DatabaseRead/Bind
- Раздельное чтение полей: DatabaseColumn-функции
- Примеры CRUD-операций в SQLite через объекты ORM
- Транзакции
- Импорт и экспорт таблицы базы данных
- Печать таблиц и SQL-запросов в журнал
- Пример поиска торговой стратегии средствами SQLite
Интеграция ООП (MQL5) и SQL: концепция ORM
Использование базы данных в MQL-программе подразумевает, что алгоритм поделен на 2 части: управляющая пишется на MQL5, а исполнительная — на SQL. В результате исходный код может начать представлять собой лоскутное одеяло и требовать внимания на поддержание согласованности. Чтобы избежать этого, в объектно-ориентированных языках разработана концепция Object-Relational Mapping (ORM), то есть отображения объектов в записи реляционных таблиц и обратно.
Суть подхода в том, чтобы инкапсулировать все действия на языке SQL в классах/структурах специальной прослойки. В результате прикладную часть программы можно писать на чистом ООП-языке (например, MQL5), не отвлекаясь более на нюансы SQL.
При наличии полноценной реализации ORM (в виде "черного ящика" с набором всех команд) у прикладного разработчика вообще появляется возможность не изучать SQL.
Кроме того ORM позволяет "незаметно" поменять "движок" СУБД при необходимости. Это не особо актуально для MQL5, потому что в него встроена только база SQLite, но некоторые разработчики предпочитают применять полновесные СУБД и подключают их к MetaTrader 5 с помощью импорта DLL-библиотек.
Наконец, использование объектов с конструкторами и деструкторами очень удобно для автоматического захвата и освобождения ресурсов. Мы рассматривали эту концепцию (RAII, Resource Acquisition Is Initialization) в разделе Управление дескрипторами файлов, однако, как мы увидим далее, работа с базой данных также строится на выделении и освобождении дескрипторов различного вида.
На следующей картинке схематично изображено взаимодействие разных слоев ПО при интеграции ООП и SQL в виде ORM.
Объектно-реляционное отображение ORM
В качестве бонуса объектная "обертка" (не только ORM, специфическая для БД) позволит автоматизировать подготовку и преобразование данных, а также проверить их на корректность в целях предотвращения некоторых ошибок.
В следующих разделах, в процессе знакомства со встроенными функциями для работы с базой, мы будем реализовывать примеры, постепенно формируя собственную простую прослойку ORM. Из-за некоторой специфики MQL5 наши классы не смогут обеспечить универсализм, покрывающий 100% задач, но окажутся полезными для многих проектов.