12

假设我有以下(PostgreSQL)表定义:

CREATE TABLE books (
    id serial NOT NULL,
    title character varying NOT NULL,

    PRIMARY KEY (id)
);

以及以下记录定义:

data Book = 
  { id :: Int
  , title :: String
  }

查询数据库中所有书籍的“取消映射”功能的基本示例是什么allBooks :: Database -> IO [Book]

4

1 回答 1

8

事实证明,我的做法是错误的。

在偶然发现 Mats Rauhala的题为Example on using HaskellDB的非常有用的博客文章后,我能够编写一个测试项目来读取books表的记录。

我首先需要定义“布局”,使用 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

其中B是导入模块的限定名称Tables.BooksallBooks具有以下类型:

allBooks :: 数据库
            -> IO
                 [记录
                    (数据库.HaskellDB.HDBRec.RecCons
                       表格.书籍.Id
                       诠释
                       (数据库.HaskellDB.HDBRec.RecCons
                          表格.书籍.标题
                          细绳
                          数据库.HaskellDB.HDBRec.RecNil))]

为了打印出每个标题,我使用了:

main :: IO ()
main = do
    books <- postgresqlConnect [("host", "localhost"), ("user", "test"), ("password", "********")] allBooks
    mapM_ putStrLn (map (\r -> r!B.title) books)
    return ()

编辑:我创建了一个 git 存储库,其中包含此示例的完整源代码:dtrebbien/haskelldb-example

于 2011-10-08T22:10:40.560 回答