#node.js #postgresql
#node.js #postgresql
Вопрос:
Я изо всех сил пытаюсь понять, как привязать массив к запросу IN в pg
библиотеке узлов.
const env = 'foo';
const sourceTypes = ['one', 'two'];
const resp = await pool.query(
`SELECT source_id, target_id FROM records
WHERE target_env = $1
AND source_type IN ($2)`,
[env, sourceTypes],
);
Я пробовал несколько вариантов, и они либо выдают ошибку, либо не возвращают никаких данных.
Я могу сделать запрос, когда я просто использую, когда я вручную привязываю, чтобы сгенерировать что-то вроде этого:
SELECT source_id, target_id FROM records
WHERE target_env = 'foo'
AND source_type IN ('one', 'two')
PS: Если вы можете предложить, как на самом деле увидеть SQL-запрос, который генерирует PG, это было бы чрезвычайно полезно!
Ответ №1:
Вы не можете привязать массив к нескольким элементам списка за один раз. Но вы можете использовать массив вместо списка, изменив in ($2)
на =ANY($2)
Вы можете увидеть, какие запросы отправляются, установив log_statement=all
, а затем просмотрев файл журнала PostgreSQL.
Комментарии:
1. В значительной степени тот же самый пример здесь, но использование
=ANY($1)
просто даетerror: malformed array literal: "ABC123"
с параметрами['ABC123']
. Было ли что-нибудь еще, что я пропустил?2. о, подождите, это я… должны быть двойные скобки: массив параметров для запроса и сам
ANY
параметр, который является массивом, как в моем примере[['ABC123']]
. Теперь работает — спасибо @jjanes