`WHERE col IN` с именованными параметрами

В примере о том, как использовать параметризованные запросы с предложением IN, синтаксис следующий:

const data = [1, 'two', 3, 'four'];

db.any('SELECT * FROM table WHERE id IN ($1:csv)', [data])
    .then(data => {
...

Кажется, я не могу заставить это работать для именованных параметров:

db.manyOrNone('SELECT widget FROM widgets WHERE id IN ($(ids:list))', 
              { ids: [1, 2, 3] })

(Я использую :list, так как он кажется взаимозаменяемым с :csv ). Я пробовал различные комбинации, такие как:

  • ($(ids):list) (синтаксическая ошибка рядом с ":")
  • (${ids:list}) (синтаксическая ошибка рядом с "$")

Я продолжаю получать недопустимые синтаксические ошибки от Postgres. Это поддерживается? Или мне нужно передать параметры в виде массива и ссылаться на них, как в примере?

Версии:

  • Постгрес: 9.5.7
  • pg-обещание: 5.7.1

ОБНОВЛЕНИЕ Я изменил свой параметр на ... WHERE widget IN ($(ids:csv))..., и теперь он работает. Похоже, что :list и :csv не взаимозаменяемы.


person BrDaHa    schedule 17.05.2018    source источник
comment
Пример кажется правильным, поэтому что-то еще должно быть отключено. Вы должны опубликовать полный пример вызова метода запроса именно так, как вы его используете.   -  person vitaly-t    schedule 17.05.2018
comment
@vitaly-t Я обновил вопрос, указав фактический фильтр, который я использовал, вместе с версиями. Хорошая библиотека, кстати :)   -  person BrDaHa    schedule 17.05.2018


Ответы (1)


Проблема в том, что вы используете устаревшую версию pg-promise. Текущая версия 8.4.4, а вы используете 5.7.1

Псевдоним :list полностью взаимозаменяем с :csv, но добавлен значительно позже v5.7.1.

Обновите до последней версии, и она будет работать и с :list.

Также предположим, что все, что есть в текущей документации, относится соответственно к текущей версии библиотеки.

person vitaly-t    schedule 17.05.2018