Параметризованные запросы Node-postgres с параметром array

#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