1

任何人都知道http://hackage.haskell.org/package/sqlite-simple-0.4.9.0/docs/Database-SQLite-Simple.html是否可以运行queryquery_在不显式指定返回类型元组的情况下打印行,出于调试目的?

或者如果没有这个包,也许还有另一个?

4

2 回答 2

1

好的,我找到了一种粗略的方法,通过更深一层,使用构建在其之上direct-sqlite的包。sqlite-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"]

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

于 2016-01-31T00:10:13.797 回答
1

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

这是打印来自 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 查询中也很有用。

于 2016-12-27T22:31:12.820 回答