#javascript #node.js #postgresql #parameterized-query #node-postgres
#javascript #node.js #postgresql #параметризованный запрос #node-postgres
Вопрос:
Я пытаюсь выполнить этот запрос PSQL, чтобы вызвать функцию и получить список идентификаторов обратно. [Эта функция работает при запуске в pgAdmin, как и должно быть, проверяется возвращаемыми идентификаторами.]
SELECT get_dataids(
'university',
'2015-08-01',
'2015-08-02',
array ['air1'],
'electricity_egauge_minutes'
);
Я использую node-postgres (https://github.com/brianc/node-postgres ) и использовали параметризованные запросы как таковые. [Эта функция успешно выполнена в серверной части узла.]
var client = new pg.Client(connectionString);
client.connect();
return client.query('SELECT ercot.get_live_realtime_lmp($1, $2)',
['ercot', 'zone'])
.then(data => {
client.end();
return data.rows;
})
.catch(err => {
client.end();
console.log('err', err);
});
Это фактический запрос, который я пытаюсь выполнить:
return client.query('SELECT public.get_dataids($1, $2, $3, $4, $5)',
[
'university',
'2015-08-01',
'2015-08-02',
['air1'],
'electricity_egauge_minutes',
])
Я думал, что смогу передать массив в качестве параметра функции, но, похоже, он не работает (о чем свидетельствует 1) не возвращающий те же идентификаторы, что и необработанный SQL-запрос, и 2) передача любой строки в массив возвращает тот же не-список идентификаторов).
Я предполагаю, что проблема конкретно заключается в попытке передать массив, но я не в состоянии определить точный способ фактической передачи в массив. Я пробовал пустой массив, массив с пустой строкой, передавая строку с 'array ["air1"]'
, передавая только строку 'air1'
и т.д. Одна из ошибок возвращается как: error: malformed array literal
, что наводит меня на мысль, что это способ, которым я передаю массив. Любые предложения будут оценены.
Комментарии:
1. Измените свой запрос с
SELECT func
наSELECT * FROM func
. Тогда это вернет вам правильный результат.2. Спасибо за попытку, Виталий-т. К сожалению, это не решает проблему и только вернет мне те же данные в другом формате (в виде массива, а не строки). Это подтверждается другими рабочими функциями, вызываемыми точно таким же образом (без
SELECT *
).3. Да, это только половина решения. Другая половина — преобразовать массив в
array[1,2,3]
формат. Похоже, базовый драйвер это не поддерживает. Однако pg-promise поддерживает гораздо более богатый синтаксис и, конечно, автоматически создает массивы 😉4. Ах, круто, спасибо. Я буду иметь это в виду на будущее. Оказывается, моя проблема заключалась в том, что функция базы данных, написанная для меня другим сотрудником, была выполнена неправильно … : P