2013-02-08 48 views
2

因为我对Haskell很新,有人可以将我推向正确的方向解决以下问题......?yesod回复纯文本

我从Yesod的脚手架应用程序开始。提供从数据库内容生成的HTML工作正常,但有没有一种优雅的方式来创建遍历数据库表的纯文本响应?通过处理器一样

getTestR = return . RepPlain . toContent ... 

简单的纯文本工作过,但我想成为:

配置/型号:

File 
    path Text 
Conf 
    key Text 
    val Text 
    file FileId 

明文如SQL查询:

select path, key, val from file, conf order by path, key; 

由于哈姆雷特是用于生成HTML,我想我必须生成响应(遍历数据库内容)完全在Haskell中?

如何在数据库实体和文本(或Int,如果行的类型为Int)之间进行转换,如何从数据库列转换为数据库ID?

+0

检查theese [SQL查询示例]实例(http://stackoverflow.com/questions/9047636/baffled-by -selectonemany合耶索德) – 2013-02-08 18:01:33

回答

2

用纯文本模板! '' #{expr}的 '' 承认文本,字符串,或的Int32 Int64类型表达式作为Text.Shakespeare.Text.ToText

{-# LANGUAGE OverloadedStrings, ConstraintKinds #-} 
module Handler.Plain where 

import Import 
import qualified Data.List as List 
import Database.Persist.Sqlite 
import qualified Data.Text as Text 
import Control.Monad.Logger (MonadLogger) 
import Control.Monad.Trans.Resource (MonadResourceBase) 
import Text.Shakespeare.Text      -- for the plain text template 

stmt :: Text 
stmt = "SELECT ??, ?? FROM File, Conf ON Conf.file = File.id ORDER BY File.path, Conf.key" 

getQryResult :: (PersistQuery SqlPersist m, MonadLogger m, MonadResourceBase m) =>() -> SqlPersist m [(Text, Text, Text)] 
getQryResult() = do 
    result <- rawSql stmt [] 

    return $ List.map getMyData (result :: [(Entity File, Entity Conf)]) 

    where 
    getMyData (Entity _ file, Entity _ conf) = (filePath file, confKey conf, confVal conf) 

getPlainR :: Handler RepPlain 
getPlainR = do 
    result <- runDB $ getQryResult() 
    return $ RepPlain $ toContent $ Text.unlines $ List.map formatMyData result 
    where 
    -- formatMyData (a, b, c) = Text.intercalate ", " [a,b,c] 

    -- with a plain text template: 
    formatMyData (a, b, c) = [st| 
     #{a}, #{b}, #{c} |]