Как передать массив в качестве параметра для rowMode = "array" в pg-prom - PullRequest
0 голосов
/ 28 мая 2020

Я хотел бы получить результат запроса, используя rowMode = "array" (поскольку это потенциально очень большая таблица, и я не хочу, чтобы она была отформатирована в объектный формат), но я не мог понять, как передать в параметре массива / списка для использования в операторе IN.

const events = await t.manyOrNone({text: `select * from svc.events where user_id in ($1:list);`, rowMode: "array"}, [[1,2]]);

Однако приведенное выше выдает ошибку: синтаксическая ошибка около или около «:»

Удаление: list не привело к работать либо:

const events = await t.manyOrNone({text: `select * from svc.events where user_id in ($1);`, rowMode: "array"}, [[1,2]]);

Ошибка: недопустимый синтаксис ввода для целого числа: "{" 1 "," 2 "}"

Я понимаю, что это может быть потому, что я вынужден использовать Формат ParameterizedQuery для rowMode = "array", который не позволяет использовать такие шикарные модификаторы, как: list, но тогда возникает вопрос: если бы я использовал формат ParameterizedQuery, то как мне изначально передать массив Javascript, чтобы он приемлемо для драйвера?

Думаю, альтернативная формулировка этого вопроса: как использовать массивы в качестве параметров для ParameterizedQuery или PreparedStatements ...

1 Ответ

0 голосов
/ 30 мая 2020

Отвечая на свой вопрос, поскольку я в конце концов нашел ответ на эту проблему: как передавать массивы в качестве параметров для использования в операторе IN при использовании rowMode="array" | ParameterizedQuery | PreparedStatements.

Поскольку этот запрос параметризуется в server, мы не можем использовать оператор IN, потому что оператор IN параметризует элементы, используя IN ($1, $2, $3...). Вместо этого нам нужно использовать оператор ANY, где ANY($1), где для $ 1 ожидается массив.

Итак, запрос, который будет работать, будет:

const events = await t.manyOrNone({text: `select * from svc.events where user_id=ANY($1);`, rowMode: "array"}, [[1,2]]);
...