Haskell和Sqlite3 - 将“SqlValue”转换为“Integer”

时间:2013-12-21 20:37:24

标签: haskell sqlite

假设我有以下Sqlite语句:

res <- quickQuery' conn_1 "SELECT COUNT(*) FROM company WHERE code = ? " [toSql code]

我想将结果转换为Integer 然后做类似的事情,

if  numRowsReturned == 0
then  something
else somethingElse

我尝试了所有可能的方法,现在我已经厌倦了它。

1 个答案:

答案 0 :(得分:3)

safeFromSql :: Convertible SqlValue a => SqlValue -> ConvertResult a是你想要的,虽然它可能不会立即看起来像。我们假设a ~ Integer。首先,我们检查seeing if there exists an instance Convertible SqlValue Integer是否允许这种假设。它不在convertible包中,但确实存在,我们可以在the instance list for SqlValue中看到它。

现在我们知道safeFromSql :: SqlValue -> ConvertResult Integer是可以接受的。让我们看看我们如何使用它。

> safeFromSql (SqlInteger 10) :: ConvertResult Integer
Right 10

我们看到ConvertResult只是type ConvertResult a = Either ConvertError a - 即。两种类型。因此,我们需要处理失败才能正确使用ConvertResult

doWithSqlValue :: SqlValue -> IO ()
doWithSqlValue someSqlValue = 
  case safeFromSql someSqlValue of
    Left err  -> print err 
    Right val -> print val