Используя pg
в моем приложении NodeJS, я хотел бы иметь возможность передавать массив функции, чтобы я мог использовать оператор IN
как часть моего запроса
Пример
async function myMethod(array) {
// array looks like [ '83', '82', '54', '55', '79' ] for example
let response;
try {
response = await pool.query("SELECT * FROM fixtures WHERE id IN($1)", [array]);
} catch (e) {
console.info(e);
}
return response.rows;
}
Я получаю ошибку
{ error: invalid input syntax for integer: "{"83","82","54","55","79"}"
Как мне здесь структурировать свой запрос?
Лучше всего просто пойти с:
pool.query("SELECT * FROM fixtures WHERE id IN($1:list)", [array]);
// [1,2,3]→"SELECT * FROM fixtures WHERE id IN(1,2,3)"
Когда переменная заканчивается на :list
, она форматируется как список значений, разделенных запятыми, причем каждое значение форматируется в соответствии с его типом JavaScript.
Причина, по которой вам это нужно, заключается в том, что по умолчанию массивы форматируются в массивы PostgreSQL, что обозначено, как вы видели, фигурными скобками.
Примечание: это было добавлено в pg
(точнее, pg-promise
) в версии 7.5.1. Если вы используете более раннюю версию, используйте вместо нее $1:csv
.
Источник: pg-обещание # csv-фильтр
Спасибо за помощь, я так понимаю, у меня не должно быть error: syntax error at or near ":"
, и у меня установлен pg
, нужно ли мне еще добавить pg-promise
, чтобы это работало?
@Richlewis pg
датирован относительно pg-promise
, и я вижу, что вы все равно используете обещания (await
в вашем коде), так что да, вместо обещания pg
просто переключитесь на pg-promise
. После npm i
просто сделайте const pg = require('pg-promise')
, и никаких изменений в вашем приложении не последует.
Вы пробовали преобразовать массив в строку? Запросы должны получать строковые объекты для подготовки оператора.