假设我有以下Sqlite语句:
res <- quickQuery' conn_1 "SELECT COUNT(*) FROM company WHERE code = ? " [toSql code]
我想将结果转换为Integer 然后做类似的事情,
if numRowsReturned == 0
then something
else somethingElse
我尝试了所有可能的方法,现在我已经厌倦了它。
答案 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