Использование массивов с pg-promise - PullRequest
0 голосов
/ 11 октября 2019

Я использую pg-обещание и не понимаю, как выполнить этот запрос. Первый запрос работает, но я хотел бы использовать безопасное экранирование символов pg-обещания, а затем я попробую второй запрос, который не работает.

Работает:

db.any(`SELECT title FROM books WHERE id = ANY ('{${ids}}') ORDER BY id`)

Не работаетт работа

db.any(`SELECT title FROM books WHERE id = ANY ($1) ORDER BY id`, ids)

1 Ответ

2 голосов
/ 12 октября 2019

В примере 2 проблемы. Во-первых, это противоречит тому, что документация говорит вам :

ВАЖНО: Никогда не используйте зарезервированный синтаксис ${} внутри строк шаблона ES6, так как они имеютнет знаний о том, как форматировать значения для PostgreSQL. Внутри шаблонных строк ES6 вы должны использовать только одну из 4 альтернатив - $(), $<>, $[] или $//.

Ручное форматирование запроса, как в первом примере,очень плохая практика, приводящая к плохим вещам, от разбитых запросов до внедрения SQL.

И вторая проблема заключается в том, что после переключения на правильное форматирование SQL, вы должны использовать CSV Filter чтобы правильно отформатировать список значений:

db.any(`SELECT title FROM books WHERE id IN ($/ids:csv/) ORDER BY id`, {ids})

или с помощью индексной переменной:

db.any(`SELECT title FROM books WHERE id IN ($1:csv) ORDER BY id`, [ids])

Обратите внимание, что я также изменил с ANY на IN операнд, так как мыпредоставляя список открытых значений здесь.

И вы можете использовать фильтр :list взаимозаменяемо, в зависимости от того, что вам нравится.

...