问题
I'm trying to do something like this with Database.HDBC.PostgreSQL:
run c "update questions set deleted = now() where question_id in (?)" [toSql ids]
where ids is [Int]. But I get the error
No instance for (Data.Convertible.Base.Convertible [Int] SqlValue)
How do you fill in an IN placeholder with HDBC?
回答1:
I don't think you can avoid building the query dynamically, but you can still avoid SQL injection and the like.
import Control.Applicative ((<$), (<$>))
import Data.List (intersperse)
let query = "update questions set deleted = now() where question_id in ("
++ intersperse ',' ('?' <$ ids)
++ ")"
in run c query (toSql <$> ids)
Links to documentation for intersperse, <$>, <$.
来源:https://stackoverflow.com/questions/16472952/how-do-you-fill-in-the-parameters-for-an-sql-in-placeholder-with-hdbc