JavaScript (Postgres DB) - Как использовать подготовленный оператор с массивом в качестве параметра в предложении WHERE IN () - PullRequest
0 голосов
/ 13 ноября 2018

В настоящее время я использую класс базы данных из http://vitaly -t.github.io / pg-promise / Database.html и пытаюсь реализовать оператор Update с использованием PreparedStatment в моей базе данных Postgres, имеямассив передан в предложение WHERE IN?

const updatePreparedStatment = new PS('prepared-statement', 'UPDATE mytable SET "MESSAGE"=$1 WHERE "ID" IN ($2)', ["dummy update", ["1","2","3"]]);

1 Ответ

0 голосов
/ 14 ноября 2018

Это описано в FAQ узла-postgres https://github.com/brianc/node-postgres/wiki/FAQ#11-how-do-i-build-a-where-foo-in--query-to-find-rows-matching-an-array-of-values

Как построить запрос WHERE foo IN (...), чтобы найти строки, соответствующие массиву значений? node-postgres поддерживает отображение простых массивов JavaScript в массивы PostgreSQL, поэтому в большинстве случаев вы можете просто передать его как любой другой параметр.

client.query("SELECT * FROM stooges WHERE name = ANY ($1)", [ ['larry', 'curly', 'moe'] ], ...);

Обратите внимание, что = ANY - это еще один способ записи IN (...), но в отличие от IN (...) он будет работать так, как вы ожидаете, когда передаете массив в качестве параметра запроса.

Если вы заранее знаете длину массива, вы можете вывести его в список IN:

// passing a flat array of values will work:
client.query("SELECT * FROM stooges WHERE name IN ($1, $2, $3)", ['larry', 'curly', 'moe'], ...);

... но мало пользы, когда = ЛЮБОЙ работает с массивом JavaScript.

Если вы используете старую версию node-postgres или вам нужно создать более сложные массивы PostgreSQL (массивы составных типов и т. Д.), С которыми не справляется node-postgres, вы можете сгенерировать литерал массива с динамическим SQL, но будьте предельно осторожны с внедрением SQL при этом. Следующий подход является безопасным, поскольку он генерирует строку запроса с параметрами запроса и сглаженным списком параметров, поэтому вы все еще используете поддержку драйвера для параметризованных запросов («подготовленных операторов») для защиты от внедрения SQL:

var stooge_names = ['larry', 'curly', 'moe'];
var offset = 1;
var placeholders = stooge_names.map(function(name,i) { 
    return '$'+(i+offset); 
}).join(',');
client.query("SELECT * FROM stooges WHERE name IN ("+placeholders+")", stooge_names, ...);

Надеюсь, это поможет, так как Google не может найти это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...