Базовый пример использования HaskellDB для отмены отображения записей таблицы - PullRequest
12 голосов
/ 08 октября 2011

Предположим, что у меня есть следующее (PostgreSQL) определение таблицы:

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

    PRIMARY KEY (id)
);

И следующее определение записи:

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

Что является базовым примером функции "unmap"запросить все книги в базе данных, allBooks :: Database -> IO [Book]?

1 Ответ

8 голосов
/ 09 октября 2011

Оказывается, я поступил неправильно.

После того, как я наткнулся на чрезвычайно полезный пост в блоге Матса Раухала под названием Пример использования HaskellDB , я смог написать тестовый проект для чтения записей таблицы books. .

Сначала мне нужно было определить «макет», который, используя haskelldb-й, не так уж и плох:

{-# 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.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 ()

РЕДАКТИРОВАТЬ: Я создал хранилище git, содержащее полные источники этого примера: dtrebbien / haskelldb-example

...