Haskell HDBC.Sqlite3 fetchAllRows
由于我是一个绝对的哈斯克尔初学者,但决心征服它,我再次寻求帮助 使用:Haskell HDBC.Sqlite3 fetchAllRows,sqlite,haskell,hdbc,Sqlite,Haskell,Hdbc,由于我是一个绝对的哈斯克尔初学者,但决心征服它,我再次寻求帮助 使用: fetchData2 = do conn <- connectSqlite3 "dBase.db" statement <- prepare conn "SELECT * FROM test WHERE id > 0" execute statement [] results <- fetchAllRows statement print results 是否有一种聪明的方法将这
fetchData2 = do
conn <- connectSqlite3 "dBase.db"
statement <- prepare conn "SELECT * FROM test WHERE id > 0"
execute statement []
results <- fetchAllRows statement
print results
是否有一种聪明的方法将这些数据清理成
Int
和[Char]
,换句话说,省略类型SqlInt64
和SqlByteString
,您可以定义一个助手:
fetchRowFromSql :: Convertible SqlValue a => Statement -> IO (Maybe [a])
fetchRowFromSql = fmap (fmap (fmap fromSql)) . fetchRow
这个实现看起来有点让人望而生畏,但这只是因为我们需要深入到分层的functor下面,正如您已经提到的(首先是IO
,然后是可能是,最后是[]
)。这将返回可从SqlValue
转换的内容。已经定义了很多这样的概念。见例。例如(使用-XTypeApplications
):
我也许应该补充一点,文档中提到了fromSql
是不安全的。这意味着,如果您试图将sql值转换为不兼容的Haskell值,程序将停止。您可以定义一个帮助程序:
fetchRowFromSql :: Convertible SqlValue a => Statement -> IO (Maybe [a])
fetchRowFromSql = fmap (fmap (fmap fromSql)) . fetchRow
这个实现看起来有点让人望而生畏,但这只是因为我们需要深入到分层的functor下面,正如您已经提到的(首先是IO
,然后是可能是,最后是[]
)。这将返回可从SqlValue
转换的内容。已经定义了很多这样的概念。见例。例如(使用-XTypeApplications
):
我也许应该补充一点,文档中提到了fromSql
是不安全的。这意味着,如果您尝试将sql值转换为不兼容的Haskell值,程序将停止。提示您正在查找来自sql的
@Shawn:尝试过了。找不到任何有效的示例。更糟糕的是:fetchRow(我实际需要的一个)将列表包装为Maybe类型,并返回例如Just[SqlInt64 3,SqlByteString“Newco”]
来添加:向下钻取值(更不用说包装为Maybe时)必须比这更简单:fetchData2=do conn建议您正在寻找fromSql
@Shawn:尝试过了。找不到任何有效的示例。更糟糕的是:fetchRow(我实际需要的一个)将列表包装为Maybe类型,并返回例如Just[SqlInt64 3,SqlByteString“Newco”]
来添加:深入到值(更不用说包装为Maybe时)必须比这更简单:fetchData2=do conn Hi Fredefox,感谢您的输入。我要试试看。我想Haskell初学者只有在阅读了4本左右的书之后才能通过做来学习……我可以通过使用fromJust
从中获得它。这很有魅力<但是,code>fromSql
要求每个解析值都有一个类型约束,如fromSql value::Int
。有没有一种快速的方法来解析几个不同类型的列,而Haskell更喜欢单一类型的列表。啊,是的,这是不幸的。也许这就是HDBC的作者不公开这样一个助手的原因。另一个库sqlite simple
通过为长度不超过一定长度的元组定义等价的Convertible
来解决这个问题。这里有一个快速而肮脏的解决方案:three=\(a:b:c:[])->(fromsqla,fromSql b,fromSql c)
此方法不安全地将列表转换为具有转换值的三元组。我相信你可以为你的用例想出一些更优雅的东西。嗨,Fredefox,谢谢你的输入。我要试试看。我想Haskell初学者只有在阅读了4本左右的书之后才能通过做来学习……我可以通过使用fromJust
从中获得它。这很有魅力<但是,code>fromSql
要求每个解析值都有一个类型约束,如fromSql value::Int
。有没有一种快速的方法来解析几个不同类型的列,而Haskell更喜欢单一类型的列表。啊,是的,这是不幸的。也许这就是HDBC的作者不公开这样一个助手的原因。另一个库sqlite simple
通过为长度不超过一定长度的元组定义等价的Convertible
来解决这个问题。这里有一个快速而肮脏的解决方案:three=\(a:b:c:[])->(fromsqla,fromSql b,fromSql c)
此方法不安全地将列表转换为具有转换值的三元组。我相信您可以为您的用例想出一些更优雅的东西。
fetchRowFromSql @String :: Statement -> IO (Maybe [String])