Перейти к содержанию

Lua-скрипты — особенности PG-совместимости

Lua-смарт-скрипты работают на обеих СУБД (MS SQL Server и PostgreSQL). Для кросс-платформенного SQL используется функция get_mspg_query() с тегами {MS}...{/MS} и {PG}...{/PG} — внутри них указывается синтаксис для соответствующей СУБД.

Известные проблемы

Различия MS SQL и PostgreSQL, которые нужно учитывать в Lua-скриптах:

Проблема MSSQL PG Решение
[Column] quoting Работает Ошибка синтаксиса {MS}sc.[Key]{/MS}{PG}sc.key{/PG}
Ключи в результатах SQL:query_one / SQL:query Регистр сохраняется (Value) Всё в нижнем регистре (value) data['Value'] or data['value']
CACHE:set с nil json_encode(nil)"null" То же Всегда проверять переменную перед кэшированием
Устаревший кэш CACHE:get проверять на ~= nil и ~= 'null'. Ручного сброса нет — менять имя ключа или ждать TTL
Таблицы без схемы dbo. Работает (dbo — схема по умолчанию) 42P01: relation not found Всегда указывать dbo.TableName
NULL в UNION ALL Чистый NULL → OK 42804: UNION types text and bigint CAST(NULL AS BIGINT) — кросс-платформенно
Boolean и integer колонки = 1 везде работает 42883: integer = boolean Не все колонки Is*/Allow* на PG имеют тип boolean. Проверять тип через information_schema.columns

При преобразовании результата запроса в словарь платформа использует доступ к ключам без учёта регистра. Поэтому в большинстве случаев обращение к полям результата по именам вроде Value/value от регистра не зависит. Однако в «сыром» SQL, при экранированных идентификаторах и явной работе со строковыми ключами различие MSSQL/PG по регистру по-прежнему нужно учитывать.

Работа со скриптами через Admin API

Получение существующего скрипта — GET /api/admin/smart/scripts/{scriptId}/editor; сохранение — POST /api/admin/smart/scripts/editor (тело: {script: <объект скрипта>, context: null}).

Не путать: GET /api/admin/smart/scripts/editor?id=... — это создание нового скрипта (возвращает пустой объект).