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=...— это создание нового скрипта (возвращает пустой объект).