`?` заполнитель для условия SQL `IN` с постоянным` rawSql` - PullRequest
0 голосов
/ 16 января 2019

Я был бы рад использовать ? заполнитель для заполнения идентификаторов для SQL IN предложения. К сожалению это следующее не работает

let idList :: [ RequestId ]
    idList = []
let sql :: String
    sql =  "SELECT ?? FROM request WHERE request.id IN ?"
rs <- runDB $ rawSql sql [ toPersistValue idList ]

Такой код приводит к ошибке базы данных, подобной:

syntax error at or near "'[283,282,281]'"

Обтекание ? заполнитель скобками (например, IN (?)) дает другой тип ошибки:

invalid input syntax for integer: "[283,282,281]"

Есть ли способ сделать это?

P.S. Похоже, это ужасное название, понятия не имею, как его улучшить

1 Ответ

0 голосов
/ 17 января 2019

Я не думаю, что есть способ сделать это с persistent. postrgresql-simple (при условии, что мы говорим о Postgres здесь), который используется persistent, имеет специальную конструкцию In , которая корректно переводится в In (..) в SQL, но persistent, похоже, не использует его. Можно надеяться, что в качестве обходного пути можно использовать конструктор PersistDbSpecific , который принимает в качестве аргумента ByteString (поэтому мы можем вручную выполнить рендеринг и передать что-то вроде (123,456,789)), но, к сожалению, он преобразуется в SQL через Неизвестный , который затем визуализируется с помощью Escape , который не только экранирует строку, но также заключает ее в кавычки , что делает наш SQL недействительным. Если бы persistent использовал Plain (что, на мой взгляд, имело бы гораздо больше смысла), этот подход сработал бы, но, к сожалению, это не так.

...