12

次の(PostgreSQL)テーブル定義があるとします。

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

    PRIMARY KEY (id)
);

そして、次のレコード定義:

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

データベース内のすべての本をクエリする「マップ解除」関数の基本的な例は何allBooks :: Database -> IO [Book]ですか?

4

1 に答える 1

8

私はこれを間違った方法で行っていたことがわかりました。

Mats Rauhalaの非常に役立つブログ投稿「HaskellDBの使用例books」に出くわした後、テーブルのレコードを読み取るためのテストプロジェクトを作成することができました。

最初に「レイアウト」を定義する必要がありました。これは、haskelldb-thを使用して、それほど悪くはありません。

{-# 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.BooksallBooksタイプがあります:

allBooks::データベース
            -> IO
                 [記録
                    (Database.HaskellDB.HDBRec.RecCons
                       Tables.Books.Id
                       Int
                       (Database.HaskellDB.HDBRec.RecCons
                          Tables.Books.Title
                          弦
                          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

于 2011-10-08T22:10:40.560 に答える