如何为HDBC中的多个项目准备数据库查询?

时间:2018-02-25 20:09:36

标签: haskell hdbc

我有一个名为text的Sqlite表,其中包含列idtext。我想使用HDBC和Haskell从id列表中的每一行获取这些值。在sqlite3命令行程序中,我可以运行查询:select id, text from text where id in (1.0,8.0);并且它可以正常工作。但这是我的Haskell代码:

-- Takes a single string of comma-delimited ids, 
-- e.g. "1.0,2.0,3.0" representing texts to get. 
getFullText conn ids = do
  stmt <- prepare conn "select id, text from text where id in (?)"
  _ <- execute stmt [toSql ids]
  fetchAllRows stmt

如果我尝试getFullText conn "1.0",我可以获取ID为1.0的项目的文本。但是,如果我尝试getFullText conn "1.0,2.0",它只会返回[]

我认为这是因为它将我的查询扩展为select text from text where id in ("1.0,8.0"),而不是select text from text where id in (1.0,8.0)select text from text where id in ("1.0","8.0")。我需要做些什么才能将?扩展为多个值?

编辑:我看到有一个非常相似的问题here,但作为一个haskell初学者,我无法弄清楚什么是神奇的<$>和{{1运营商做。 Heres是我尝试过的:

<$

但是当我尝试将此函数应用于getFullText conn ids = do let query = "select id, text from text where id in (" ++ intersperse ',' ('?' <$ ids) ++ ")" stmt <- prepare conn query _ <- executeMany stmt ids fetchAllRowsAL stmt 和Sqlvalues列表时,我得到conn。但是我认为我传球的是20码,所以应该没问题?我认为问题是我并不真正了解*** Exception: SqlError {seState = "", seNativeError = -1, seErrorMsg = "In HDBC execute, received [SqlByteString \"105.0\"] but expected 20 args."}正在做什么。

0 个答案:

没有答案