首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从haskell数据库查看数据

如何从haskell数据库查看数据
EN

Stack Overflow用户
提问于 2013-12-12 02:06:57
回答 1查看 394关注 0票数 1

我在哈斯克尔数据库里有桌子。我的“link_des”表有两列。我想同时查看两列(仅数据)。我的代码是:

代码语言:javascript
复制
printURLs :: IO ()
printURLs = do urls <- getURLs
           mapM_ print urls

getURLs :: IO [String]
getURLs = do conn <- connectSqlite3 "database.db"
         res <- quickQuery' conn "SELECT * FROM link_des" []
         return $ map fromSql (map head res)

有了这个,我得到了第一列数据,如

"col_1_data_1","col_1_data_2",

用“最后”代替“头”我可以得到

"col_2_data_1","col_2_data_2",

但我想要得到的数据

("col_1_data_1","col_2_data_1"),“col_1_data_2”,“col_2_data_2”

它实际上类似于模式(row_1),(row_2),.

有人能帮帮我吗。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-12-12 04:18:48

如果您查看quickQuery‘的类型签名,您将看到它返回IO [SqlValue]类型。这意味着你已经有了一个非常类似于你想要的形式的数据.而不是

代码语言:javascript
复制
[("col_1_data_1","col_2_data_1"),("col_1_data_2","col_2_data_2"), ...]

你有

代码语言:javascript
复制
[["col_1_data_1","col_2_data_1"],["col_1_data_2","col_2_data_2"], ...]

您编写的函数只是使用"map head“提取了第一列。

您总是可以编写一些代码来将具有已知数量的列和类型的表转换为相应的元组(使用诸如“先转换,第二= (fromSql first,fromSql second )”之类的函数,但是要为具有不同列数和类型的任意表编写这样的代码要困难得多。这有两个原因.

首先,您需要将列表转换为元组,除非使用扩展,否则在Haskell中,对于不同大小的列表,这是不可能的。主要问题是每个元组的大小都是它自己的类型,单个函数不能根据输入选择其输出类型。您可以使用GHC扩展来进行一些欺骗,但是结果可能更复杂,您可能想进入其中。

其次,您必须将结果中的每个值从SqlValue转换为适当的Haskell类型。由于类似的原因,这也很难做到。

你可能想考虑另一种方法.看看Yesod持久数据库库,它在http://www.yesodweb.com/book/persistent中进行了描述。这样,就可以在准引号中定义模式,并创建完全类型安全的Haskell记录。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20533718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档