2011-10-08 19 views
11

Giả sử rằng tôi có như sau (PostgreSQL) định nghĩa bảng:dụ cơ bản của việc sử dụng HaskellDB để unmap hồ sơ của một bảng

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

    PRIMARY KEY (id) 
); 

Và định nghĩa kỷ lục sau đây:

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

là gì cơ bản ví dụ về hàm "unmap" để truy vấn tất cả các sách trong cơ sở dữ liệu, allBooks :: Database -> IO [Book]?

Trả lời

8

Nó chỉ ra rằng tôi đã đi về điều này một cách sai lầm.

Sau khi vấp ngã khi bài đăng trên blog của Mats Rauhala cực kỳ hữu ích có tiêu đề Example on using HaskellDB, tôi có thể viết một dự án thử nghiệm để đọc các bản ghi của bảng books.

đầu tiên tôi cần thiết để xác định "bố trí", trong đó, sử dụng haskelldb thứ, không phải là quá xấu:

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

Từ đó, allBooks chức năng là:

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

nơi B là tên đủ điều kiện của mô-đun đã nhập Tables.Books. allBooks có các loại:

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

Để in ra mỗi tiêu đề, tôi đã sử dụng:

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

EDIT: Tôi tạo ra một kho git chứa nguồn hoàn chỉnh của ví dụ này: dtrebbien/haskelldb-example

Các vấn đề liên quan