2011-10-08 14 views
11

Załóżmy, że mam następujący (PostgreSQL) definicję tabeli:podstawowy przykład użycia HaskellDB odmapować rekordy tabeli

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

    PRIMARY KEY (id) 
); 

a następującą definicję rekordu:

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

Co jest podstawowym przykład "unmap" funkcji do zapytania wszystkich książek w bazie danych, allBooks :: Database -> IO [Book]?

Odpowiedz

8

Okazuje się, że podążałem tą drogą w niewłaściwy sposób.

Po natknięciu się na wyjątkowo pomocny wpis na blogu Mats Rauhala pod tytułem Example on using HaskellDB, udało mi się napisać projekt testowy, aby odczytać zapisy tabeli books.

ja najpierw potrzebne do określenia "układ", który za pomocą haskelldb-ty, nie jest tak źle:

{-# 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|]) 
    ] 

Stamtąd funkcja allBooks jest:

allBooks db = query db $ do 
    books <- table B.books 
    return books 

gdzie B jest kwalifikowaną nazwą importowanego modułu Tables.Books. allBooks ma typ:

 
allBooks :: Database 
      -> IO 
       [Record 
        (Database.HaskellDB.HDBRec.RecCons 
         Tables.Books.Id 
         Int 
         (Database.HaskellDB.HDBRec.RecCons 
          Tables.Books.Title 
          String 
          Database.HaskellDB.HDBRec.RecNil))] 

wydrukowania każdego tytułu, że stosuje się:

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

Edycja: utworzonego repozytorium git zawierającego kompletne źródła przykładzie: dtrebbien/haskelldb-example

Powiązane problemy