如何用`sqlite-simple`查询而不必指定具体的返回类型?

时间:2016-01-30 23:48:19

标签: sqlite haskell

任何人都知道http://hackage.haskell.org/package/sqlite-simple-0.4.9.0/docs/Database-SQLite-Simple.html是否可以运行queryquery_,可以打印行而无需显式指定返回类型元组,以进行调试?

或者如果不是这个包,可能还有另一个?

2 个答案:

答案 0 :(得分:1)

好的,我已经找到了一种粗暴的方法,使用direct-sqlitesqlite-simple构建在其上的软件包,更深入一级。

import           Database.SQLite.Simple
import           Database.SQLite3.Direct (exec, execWithCallback)

let sql = "SELECT * FROM table LIMIT 3"
let cb count names vals = print vals
execWithCallback (connectionHandle conn) sql cb

在我的案例中打印的内容如下:

[Just "1",Just "2016-01-23 11:25:39.16759",Just "val1"]
[Just "2",Just "2016-01-23 11:25:40.266674",Just "val2"]
[Just "3",Just "2016-01-23 11:25:41.396901",Just "val3"]

如果有其他人知道更好的方法,请分享!

答案 1 :(得分:0)

很抱歉没有先前扫描与我的图书馆相关的问题。

这是打印出来自SELECT查询的原始SQLite值的一种方法。它不是超级干净或明显。

我们的想法是为它定义一个调试类型DebugShowType和一个FromField实例,它将每个SQLite行/列转换为一个字符串。

newtype DebugShowType = DebugShowType String deriving (Eq, Show, Typeable)

instance FromField DebugShowType where
  fromField f = cvt f . fieldData $ f where
    cvt _ v = Ok $ DebugShowType (show v)

testShowRawValues :: IO ()
testShowRawValues = do
  elems <- query_ conn "SELECT 13, 'foo'" :: IO [[DebugShowType]]
  mapM_ (\v -> putStrLn (show v ++ "\n"))  elems

这应该打印如下:

[DebugShowType "SQLInteger 13",DebugShowType "SQLText \"foo\""]

Database.SQLite.Simple.setTrace对于跟踪将哪些值替换为SQL查询也很有用。