Фильтр CSV из pg-обещания принимает только первое значение из массива - PullRequest
3 голосов
/ 21 октября 2019

Мой запрос pg-обещания (передано 2 идентификатора в массиве):

db.any(`SELECT * FROM users WHERE user_id IN ($1:csv)`, team.member_ids)

Консольный вывод запроса и параметров, переданных в pg-обещание:

SELECT * FROM users WHERE user_id IN ($1:csv) [ 1, 2 ]
//Fails one row returned, two expected

Однако я получаю только один результат. Если я выполню следующий запрос в psql, я получу два результата:

select * from users where user_id IN (1,2);
//Works successfully with two rows returned

Любая помощь приветствуется!

1 Ответ

1 голос
/ 21 октября 2019

Это объясняется в Форматирование запроса , как одно значение в сравнении с массивом изменяет интерпретацию значений:

Это, однако, работает только для типов number, bigint, string, boolean, Date и null, потому что такие типы, как Array и Object изменяют способ интерпретации параметров.

db.any(`SELECT * FROM users WHERE user_id IN ($1:csv)`, team.member_ids)
//=> SELECT * FROM users WHERE user_id IN (1)

Поскольку выше вы переходите внепосредственно массив значений, $1 относится к первому элементу в этом массиве. Чтобы $1 ссылался на весь массив значений, само это значение должно находиться внутри массива:

db.any(`SELECT * FROM users WHERE user_id IN ($1:csv)`, [team.member_ids])
//=> SELECT * FROM users WHERE user_id IN (1,2)

В качестве альтернативы, рекомендуемое использование Именованных параметров делает код болеекратко:

db.any(`SELECT * FROM users WHERE user_id IN ($<member_ids:csv>)`, team)
//=> SELECT * FROM users WHERE user_id IN (1,2)

В общем, используйте pg-monitor , чтобы увидеть, какие запросы выполняются.

...