我在哈斯克尔数据库里有桌子。我的“link_des”表有两列。我想同时查看两列(仅数据)。我的代码是:
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),.
有人能帮帮我吗。谢谢。
发布于 2013-12-12 04:18:48
如果您查看quickQuery‘的类型签名,您将看到它返回IO [SqlValue]类型。这意味着你已经有了一个非常类似于你想要的形式的数据.而不是
[("col_1_data_1","col_2_data_1"),("col_1_data_2","col_2_data_2"), ...]你有
[["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记录。
https://stackoverflow.com/questions/20533718
复制相似问题