haskell - 使用 HaskellDB 取消映射表记录的基本示例

标签 haskell haskelldb

假设我有以下(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] ?

最佳答案

事实证明,我的做法是错误的。

偶然发现Mats Rauhala的标题为 Example on using HaskellDB 的非常有用的博文,我可以写一个测试项目来读取books的记录 table 。

我首先需要定义“布局”,使用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.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))]

To print out each title, I used:

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

关于haskell - 使用 HaskellDB 取消映射表记录的基本示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7697620/

相关文章:

haskell - 绝望 : How to install Haskell School of Expression graphics pkg, Windows XP 和 7

haskell - 理解函数 elem 和 isInfixOf

generics - haskell Data.HList 的简单使用示例

list - 递归定义init函数

multithreading - 如何使用Data.Concurrent.mergeIO?

haskell - 如何将 HaskellDB 与多态字段一起使用? (实例重叠的问题)

HaskellDB - 'Database' 变量不在范围内

haskell-platform - 如何在 Haskell 中创建运算符?