Как привязать массив к состоянию IN с помощью Node postgres

#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