2012-07-31 55 views
12

Haskell和Yesod新手在這裏。我一直在嘗試遵循Yesod書(http://www.yesodweb.com/book/persistent)中Persistent章節中的Yesod示例的集成。 Sqlite編譯並運行良好,似乎。但是,我試圖使用MongDB,並且很難讓事情順利進行。具體做法是:Yesod/Persistent的MongoDB示例

  1. 在SQLite的例子:

    share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist|

    的耶索德書上說 「蒙戈代碼將使用mongoSettings來代替。」但是我無法在任何模塊中找到它,並且代碼不能編譯。所以不是,我只好用這個來代替mongoSettings

    MkPersistSettings { mpsBackend = ConT ''Action }

    我不得不進口Language.Haskell.TH.Syntax得到它來編譯,這我假設應該從用戶隱藏起來我當然做得不對。

    此外,我發現在Mongo的Persistent測試中沒有「共享」和「遷移」部分。我實際上不確定爲什麼,我猜這是因爲MongoDB是無模式的,不需要遷移?

  2. SqlPersist

    我想MongoPersist將是對口SqlPersist,我想這幾乎是 - 我發現MongoPersist一個實例在持久性測試目錄的init.hs。但它被評論了,所以我有一種感覺它已經過時了?無論如何,據我所知,它還沒有定義。所以我不知道該怎麼以下行轉換(將耶索德書的第115頁,或附近的http://www.yesodweb.com/book/persistent結束)到MongoDB的工作:

    instance YesodPersist PersistTest where 
        type YesodPersistBackend PersistTest = SqlPersist 
        runDB action = do 
         PersistTest pool <- getYesod 
         runSqlPool action pool 
    
  3. 使用withMongoDBConn

    所以對於源碼,代碼(從上面所述網頁第一示例):

    main :: IO() 
    main = withSqliteConn ":memory:" $ runSqlConn $ do 
        runMigration migrateAll 
        johnId <- insert $ Person "John Doe" $ Just 35 
        ... and so on 
    

    但是

    main :: IO() 
    main = withMongoDBConn ":memory:" $ runMongoDBConn $ do 
        runMigration migrateAll 
        johnId <- insert $ Person "John Doe" $ Just 35 
        ... and so on   
    

不起作用。首先,由於某種原因,runMigration不在範圍內。好的,也許我不需要遷移MongoDB,所以我刪除了該行。然後,編譯器會抱怨: Couldn't match expected type AccessMode'與實際類型m0 b0' Expected type: m0 t0 -> (t0 -> m0 b0) -> AccessMode Actual type: m0 t0 -> (t0 -> m0 b0) -> m0 b0等等。到了這個階段,我對monads的粗略認識還不足以證明這一點。總而言之,我很難將Sodite的書中的Yesod示例集成到MongoDB中。有人能給我提供一個Yesod/Persistent with MongoDB的具體例子嗎?非常感謝提前。

+1

您可以使用'yesod init'腳手架工具,生成一個MongoDB站點並查看它是如何配置的。很難確切地說出你解釋你的情況時缺少哪些部分。 – dflemstr 2012-07-31 08:25:11

+0

感謝您的建議。仔細看,這有一點幫助......儘管在大多數情況下,目錄樹中生成的代碼對於我來說太複雜了,無法弄清楚發生了什麼。我將編輯原始帖子以澄清事情。 – Victor 2012-07-31 17:32:45

回答

11

我今天在Github Yesod Cookbook上添加了一個頁面,該頁面使用MongoDB和Persistent。但是,它不使用withMongoDBConn,它也不會避免TH。另外,我解釋了爲什麼我使用單獨的YAML配置文件。鏈接:http://bit.ly/VLvmoK

+0

這個例子應該修改爲最新的persistent-mongodb 2.x:let mongoSettings =(mkPersistSettings(ConT''MongoContext)){mpsGeneric = False} – 2016-01-24 15:09:17

+0

「MongoBackend」改爲「MongoContext」 – 2016-01-24 15:10:43

3

我知道這是一個老問題的答案,但是這裏是一個Yesod獨立的方式來持久使用MongoDB。這可能對持久的新手有用。

{-# LANGUAGE TemplateHaskell #-} 

import Database.Persist 
import Database.Persist.TH 
import Database.Persist.MongoDB 
import Network (PortID (PortNumber)) 

let mongoSettings = (mkPersistSettings (ConT ''MongoBackend)) {mpsGeneric = False} 
    in share [mkPersist mongoSettings] [persistLowerCase| 
Person 
    name String 
    age Int Maybe 
    deriving Show 
BlogPost 
    title String 
    authorId PersonId 
    deriving Show 
|] 
runDBActions actions = 
    withMongoDBConn "myDatabaseName" "localhost" (PortNumber 27017) Nothing 2000 $ \pool ->  
     runMongoDBPool master actions pool 

actions = do 
    mkey <- insert $ Person "John Doe" $ Just 35 
    ... 

main :: IO() 
main = do 
    runDBactions actions