2013-02-08 50 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} |]