2011-10-08 21 views
11

Supongamos que tengo el siguiente (PostgreSQL) definición de la tabla:Ejemplo básico de utilizar HaskellDB desasignar registros de una tabla

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

    PRIMARY KEY (id) 
); 

Y el siguiente registro de definición:

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

Qué es un básico ejemplo de una función "unmap" para consultar todos los libros en la base de datos, allBooks :: Database -> IO [Book]?

Respuesta

8

Resulta que estaba haciendo esto de la manera incorrecta.

Después de tropezar con Mats Rauhala 's muy útil post titulado Example on using HaskellDB, yo era capaz de escribir un proyecto de prueba para leer los registros de la tabla books.

primera vez que necesita para definir el "diseño", el cual, usando haskelldb-ésimo, no es tan malo:

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

A partir de ahí, la función allBooks es:

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

donde B es el nombre calificado del módulo importado Tables.Books. allBooks tiene el tipo:

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

Para imprimir cada título, I utilizado:

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

EDIT: I creado un repositorio git que contiene las fuentes completas de este ejemplo: dtrebbien/haskelldb-example

Cuestiones relacionadas