Dan*_*ien 12 haskell haskelldb
假设我有以下(PostgreSQL)表定义:
CREATE TABLE books (
id serial NOT NULL,
title character varying NOT NULL,
PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)
以下记录定义:
data Book =
{ id :: Int
, title :: String
}
Run Code Online (Sandbox Code Playgroud)
查询数据库中所有书籍的"取消映射"功能的基本示例是什么allBooks :: Database -> IO [Book]?
事实证明,我是以错误的方式解决这个问题.
在发现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|])
]
Run Code Online (Sandbox Code Playgroud)
从那里,allBooks功能是:
allBooks db = query db $ do
books <- table B.books
return books
Run Code Online (Sandbox Code Playgroud)
其中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 ()
Run Code Online (Sandbox Code Playgroud)
编辑:我创建了一个git存储库,其中包含此示例的完整源代码:dtrebbien/haskelldb-example
| 归档时间: |
|
| 查看次数: |
762 次 |
| 最近记录: |