2013-05-09 57 views
3

我试图做这样的事情与Database.HDBC.PostgreSQL:如何用HDBC填充SQL IN占位符的参数?

run c "update questions set deleted = now() where question_id in (?)" [toSql ids] 

其中IDS是[INT]。但我得到错误

No instance for (Data.Convertible.Base.Convertible [Int] SqlValue) 

你如何填写一个IN占位符与HDBC?

回答

2

我不认为你可以避免动态构建查询,但你仍然可以避免SQL注入等。

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) 

链接文档intersperse<$><$

+0

你能再解释一下'<$>'和'<$'的工作原理吗?这些链接似乎已经死亡。 – Jono 2018-02-26 00:05:01

+0

@Jono我更新了链接,没有死。 – dave4420 2018-02-26 21:53:44