pg-promise: имена SQL ~ или:name, похоже, не работает с параметризованным запросом

#javascript #postgresql #postgresql-10 #pg-promise

#javascript #postgresql #postgresql-10 #pg-promise

Вопрос:

Я пытаюсь использовать ParameterizedQuery с именами SQL внутри его text параметра.

Я знаю, что в документах указано, что этот параметр должен быть string или QueryFile .

В принципе, то, что я хотел бы сделать, это что-то вроде:

 import pgPromise from 'pg-promise';

const pgp = pgPromise();
const pq = new pgp.ParameterizedQuery({
      text: `
        SELECT $1:name from my_table
        where $2:name = $3;
        `,
      rowMode: 'array'
    });
const params = {user_col: 'user', id_col: 'id', id_value: 'XXX'};
try {
  return await this.db.any(pq, Object.values(params));
} catch (e) {
  console.error(e);

  return e;
}
  

Я получаю ошибку, подобную:

 QUERY: {
[start:run]   text: 'n'  
[start:run]     '        SELECT $1:name from my_tablen'  
[start:run]     '        where $2:name = $3;n'  
[start:run]     '        ',
[start:run]   values: [ 'user', 'id', 'XXX' ],
[start:run]   rowMode: 'array'
[start:run] }
[start:run] error: syntax error at or near ":"
  

Возможно ли использовать :name (или ~ ) внутри ParameterizedQuery ? Дело в том, что я действительно хочу, чтобы результатом моего запроса был массив строк, а не массив объектов строк, и parmater ParameterizedQuery, rowMode установленный на array , кажется, единственный способ, которым я могу это сделать.

Комментарии:

1. Я предполагаю, что это невозможно, как текстовые запросы, так Only the basic variables ($1, $2, etc) can be used in the query, because Parameterized Queries are formatted on the server side. (см. Здесь ). Я прав? Есть ли какая-либо альтернатива возвращению массива строк вместо массива объектов строк из запроса?

2. Фильтры форматирования не работают в параметризованных запросах или подготовленных операторах, поскольку они форматируются на стороне сервера.

Ответ №1:

Из документов по фильтрам форматирования:

Обратите внимание, что фильтры форматирования работают только для обычных запросов и недоступны в PreparedStatement или ParameterizedQuery, поскольку они, по определению, отформатированы на стороне сервера.

Это примечание в официальной документации было добавлено после этого вопроса, потому что оно возникало несколько раз раньше. Надеюсь, теперь это будет более понятно.

Комментарии:

1. Спасибо, это проясняет проблему, и здорово, что вы даже обновили документы