Haskell HDBC.Sqlite3 fetchAllRows

时间:2018-08-29 08:36:05

标签: sqlite haskell hdbc

由于我是绝对的Haskell初学者,但决心要征服它,所以我再次寻求帮助。

使用:

fetchData2 = do
  conn <- connectSqlite3 "dBase.db"
  statement <- prepare conn "SELECT * FROM test WHERE id > 0"
  execute statement []
  results <- fetchAllRows statement
  print results

返回:

[[SqlInt64 3,SqlByteString "Newco"],[SqlInt64 4,SqlByteString "Oldco"],[SqlInt64 5,SqlByteString "Mycom"],[SqlInt64 4,SqlByteString "Oldco"],[SqlInt64 5,SqlByteString "Mycom"]]

是否有一种聪明的方法将这些数据清除到Int[Char]中,换句话说,省去了类型SqlInt64SqlByteString

1 个答案:

答案 0 :(得分:1)

您可以定义一个助手:

fetchRowFromSql :: Convertible SqlValue a => Statement -> IO (Maybe [a])
fetchRowFromSql = fmap (fmap (fmap fromSql)) . fetchRow

该实现看起来有些令人生畏,但这只是因为我们需要像您已经指出的那样深入挖掘分层函子(首先IO,然后是Maybe,最后是[]) 。这将返回可从SqlValue转换的内容。已经定义了很多。参见例如the docs。一个示例(使用-XTypeApplications):

fetchRowFromSql @String :: Statement -> IO (Maybe [String])

我也许应该补充一点,该文档提到fromSql是不安全的。这意味着,如果您尝试将sql值转换为不兼容的Haskell值,则程序将停止。