Это объясняется в Форматирование запроса , как одно значение в сравнении с массивом изменяет интерпретацию значений:
Это, однако, работает только для типов 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 , чтобы увидеть, какие запросы выполняются.