我有一个名为text
的Sqlite表,其中包含列id
和text
。我想使用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."}
正在做什么。