«SELECT * FROM $ 1» подготовил ошибку оператора: error: синтаксическая ошибка в или около «$ 1» - PullRequest
0 голосов
/ 10 мая 2018

Почему возникает эта ошибка?

 const response = await pool.query(`SELECT * FROM $1`, [table]);

Значение [table] равно ["person"] в моем тестовом примере.Но он продолжает ошибаться до:

error: syntax error at or near "$1"

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы не можете использовать переменные для имен / идентификаторов SQL, по крайней мере, с основным драйвером.

Вот пример того, как это работает с pg-обещание :

const response = await db.query('SELECT * FROM $1:name', table);

или

const response = await db.query('SELECT * FROM $1:name', [table]);

или

const response = await db.query('SELECT * FROM ${table:name}', {table});

И существует еще много возможных вариантов с точки зрения синтаксиса Имена SQL и типа используемых вами методов.

0 голосов
/ 10 мая 2018

Нельзя использовать заполнители ($1) для идентификаторов (таких как имена столбцов и таблиц), заполнители только для значений; вы можете думать об этом как о разнице между 'name' (значение) и var name (идентификатор).

Вместо этого вы можете использовать манипуляции со строками, и вы захотите добавить идентификатор в белый список, чтобы избежать проблем:

const safeTables = [ 'person', ... ]; // Known safe values.
if(!safeTables.includes(table)) {
    // throw an exception, return an error, ...
}

const response = await pool.query(`SELECT * FROM ${table}`);

Эта интерполяция строк безопасна, поскольку вы разрешаете только известные безопасные значения. Вы также можете использовать функцию, которая знает, как правильно заключать в кавычки идентификаторы (например, escape.ident из pg-escape ).

...