#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. Спасибо, это проясняет проблему, и здорово, что вы даже обновили документы