事实证明我的处理方式是错误的。
偶然发现之后马茨·劳哈拉 https://github.com/MasseR非常有帮助的博客文章,标题为使用 HaskellDB 的示例 http://users.utu.fi/machra/posts/2011-07-15-haskelldb.html,我能够编写一个测试项目来读取books
table.
我首先需要定义“布局”,使用 haskelldb-th ,这还不错:
{-# LANGUAGE TemplateHaskell #-}
module Tables.Books (
books
, id
, title
, Books
) where
import Database.HaskellDB.CodeGen
import Prelude hiding (id)
mkDBDirectTable "Books" [
("id", [t|Int|])
, ("title", [t|String|])
]
从那里开始,allBooks
函数是:
allBooks db = query db $ do
books <- table B.books
return books
where B
是导入模块的限定名称Tables.Books
. allBooks
具有类型:
allBooks :: Database
-> IO
[Record
(Database.HaskellDB.HDBRec.RecCons
Tables.Books.Id
Int
(Database.HaskellDB.HDBRec.RecCons
Tables.Books.Title
String
Database.HaskellDB.HDBRec.RecNil))]
为了打印每个标题,我使用了:
main :: IO ()
main = do
books <- postgresqlConnect [("host", "localhost"), ("user", "test"), ("password", "********")] allBooks
mapM_ putStrLn (map (\r -> r!B.title) books)
return ()
EDIT:我创建了一个 git 存储库,其中包含此示例的完整源代码:dtrebbien/haskelldb-示例 https://github.com/dtrebbien/haskelldb-example