Как передать массив в качестве параметра для rowMode=array в pg-promise

Я хотел бы получить результат запроса с использованием rowMode="array" (поскольку это потенциально очень большая таблица, и я не хочу, чтобы она форматировалась в формат объекта), но я не мог понять, как передать массив Параметр /list для использования в операторе 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...


person Andrew Ooi    schedule 28.05.2020    source источник
comment
how do I use arrays as parameters for ParameterizedQuery or PreparedStatements... - это был бы правильный вопрос, потому что их использование действительно заставляет форматировать запрос на стороне сервера, поэтому вы не можете использовать такие вещи, как фильтры форматирования. Но вам не нужно использовать rowMode, есть лучшие способы обработки больших таблиц, вот что вам следует искать.   -  person vitaly-t    schedule 28.05.2020
comment
Привет @vitaly-t, не могли бы вы указать мне, где я должен искать при обработке больших данных SELECT вместо rowMode? Я предполагал, что rowMode более оптимизирован, так как нет необходимости в переводе данных. Чего я пытаюсь избежать, так это передачи большой таблицы в формате объект-ключ между базой данных -> nodeJS -> интерфейсом.   -  person Andrew Ooi    schedule 29.05.2020
comment
Это называется разбивкой на страницы данных. И формат объекта-ключа невелик, если вы его не сделаете. Вы неправильно смотрите на оптимизацию трафика.   -  person vitaly-t    schedule 29.05.2020
comment
Хорошо, я думаю, что пагинация данных — это действительно другая тема, я уже изучаю ее, но я все же хотел бы оптимизировать эффективность сайта с большим объемом данных (независимо от проблем с нумерацией страниц). Могу ли я вернуться к исходному вопросу... есть ли способ передать массив Javascript в качестве параметра для ParameterizedQuery/PrepreadStatement? Я просто хочу знать, возможно ли это. например как я могу запустить select * from users where user_id in ($1), где $1 — это массив Javascript. Я не могу понять это! Или я застрял с использованием форматирования запроса на стороне сервера? Большое спасибо за ваше время.   -  person Andrew Ooi    schedule 30.05.2020
comment
Привет, после экспериментов я обнаружил, что массив на самом деле принимается, но нам нужно использовать ANY() вместо оператора IN, который на самом деле принимает массив в качестве входных данных (дох! Глупо с моей стороны игнорировать это!). Поэтому я закрою и сам отвечу на этот вопрос.   -  person Andrew Ooi    schedule 30.05.2020


Ответы (1)


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

Поскольку этот запрос параметризуется на сервере, мы не можем использовать оператор 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]]);
person Andrew Ooi    schedule 30.05.2020