Руководство Melbis Shop: оглавление
Раздел engine_db_* читает и меняет данные магазина прямо
в его базе, минуя окна программы.
| Инструмент | Что делает |
|---|---|
engine_db_tables |
структура таблиц: колонки, ключи, генератор |
engine_db_select |
читает данные пулом шагов |
engine_db_execute |
меняет данные пулом шагов |
engine_db_locks |
кто взял таблицы в работу |
engine_db_unlocks |
снимает блокировки, зависшие под своим логином |
Чтение и изменение — разные права: владелец может выдать
engine_db_select без engine_db_execute.
Вся работа с данными идёт пулом — списком шагов, которые движок
выполняет по порядку в одном соединении с базой. Только
так временная таблица и LAST_INSERT_ID() доживают от шага к
шагу: отдельные вызовы их не соединят.
{"pool": [
{"do": "generate", "table": "store", "name": "new_id"},
{"do": "insert", "table": "store", "rows": [{"id": "@new_id", "name": "Product"}]},
{"do": "change", "tables": ["store"]}
]}engine_db_select берёт только читающие шаги,
engine_db_execute — любые; сами шаги описаны на страницах
engine_db_select и engine_db_execute.
Значения — в params. В тексте запроса
пишут :ИМЯ заглавными буквами, а значение кладут в
params под этим именем в любом регистре. Так кавычка,
апостроф или чужой алфавит запрос не ломают.
@имя подставляет результат более
раннего шага с этим name: id из генератора,
insert_id вставки, id нового узла дерева. Работает в
params, в значениях строк insert, в
id и parent_id шагов дерева и в
ids шага dependent. Шаг select
значений не одалживает.
Текст запроса уходит в базу как написан — одна
команда на шаг. По пути с ним делают только две вещи.
{DBNICK} заменяется везде, даже внутри строки в кавычках.
:ИМЯ становится параметром, только если в
params есть такое имя, — но тогда везде, и то же слово
внутри строки в кавычках ломает шаг. Экранирование — самой базы:
\', \\, ''.
Транзакции нет. Ошибка останавливает пул, но
сделанное до неё остаётся. Таблицы, взятые пулом в работу, он отпускает
и после ошибки SQL; если же запрос упал целиком, строка блокировки
остаётся, и её снимает engine_db_unlocks.
Объём. Шаг, вернувший больше 5000 строк, отказывает
— сузьте запрос или повторите шаг с "big": true. Строки
тяжёлого шага — с big или с ответом больше 100 000 байт —
уходят в файл
mcp\melbis\queries\<дата_время>.<имя шага>.jsonl
папки магазина, по объекту JSON на строку; в ответе шаг оставляет
rows, путь file и head — три
первые строки, обрезанные до 300 символов. Шаг с полем
output пишет строки в названный файл при любом размере.
big снимает только предел строк: широкая таблица,
прочитанная целиком, может исчерпать память сервера.
Большой пул собирают скриптом на этом компьютере и
передают файлом pool_source вместо pool:
абсолютный путь или путь от папки магазина.
{DBNICK}_store или настоящим именем ms_store.
Первая форма лучше: такой запрос переносится в код модуля без
правок.table и tables —
у шагов пула и у engine_db_unlocks — таблица называется
голым именем store или настоящим ms_store.
Форма {DBNICK}_store там не принимается.Что значит каждое поле, описано в папке Engine\Tables\
программы — по файлу на таблицу.
Melbis не пользуется блокировками СУБД. Взять таблицу в работу —
значит пометить её занятой: какая таблица, какой операцией, каким
пользователем, с какого времени; эти пометки показывает
engine_db_locks. СУБД чужой запрос при этом не остановит,
поэтому занятость таблиц проверяют сами.
lock.lock пережидает блокировку на
мгновение и отказывает, если таблица всё ещё занята, — даже если её
держит окно программы под тем же логином. Всё, что пул взял, он
отпускает сам, когда заканчивает.engine_db_unlocks.В программе все блокировки видны и снимаются в диспетчере — «Диспетчер и блокировки».