Оказывается, я поступил неправильно.
После того, как я наткнулся на чрезвычайно полезный пост в блоге Матса Раухала под названием Пример использования 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