Yesod / Persistent的MongoDB示例

时间:2012-07-31 01:33:20

标签: mongodb haskell persistent yesod

Haskell和Yesod新手在这里。我一直在尝试从Yesod书中的Persistent章节(http://www.yesodweb.com/book/persistent)中跟踪与Yesod示例的集成。似乎Sqlite编译并运行良好。但是,我正在尝试使用MongDB,并且很难让事情发挥作用。具体做法是:

  1. 在sqlite的示例中:

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

    Yesod书中说“Mongo代码将使用mongoSettings代替。”但我无法在任何模块中找到它,并且代码无法编译。因此,我必须使用此而不是mongoSettings

    MkPersistSettings { mpsBackend = ConT ''Action }

    我必须导入Language.Haskell.TH.Syntax才能让它进行编译,我假设它应该对用户隐藏,所以我当然不会这样做。

    另外,我发现在Mongo的Persistent测试中没有“share”和“migrate”部分。我实际上不确定为什么,我猜它是因为MongoDB是Schema-less而不需要迁移?

  2. SqlPersist

    我认为MongoPersist将是SqlPersist的对应物,我猜它几乎是 - 我在Persistent的测试目录中的init.hs中找到了一个MongoPersist实例。但它被评论出来了,所以我觉得它已经过时了?否则,就我所知,它无论如何都没有定义。所以我不知道如何转换以下行(Yesod书的第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

    因此对于sqlite,代码是(上面网页的第一个例子):

    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          
    
  4. 不起作用。首先,runMigration由于某种原因不在范围内。好吧,也许我不需要迁移MongoDB,所以我删除了那一行。然后,编译器抱怨: 具有实际类型Couldn't match expected type的{​​{1}} AccessMode',依此类推。在这个阶段,我对monad的粗略了解并不足以解决这个问题。

    总而言之,我很难将从Sqlite到MongoDB的书中的Integration与Yesod示例转换。有人可以给我一个MongodDB的Yesod / Persistent的具体例子吗?非常感谢提前。

2 个答案:

答案 0 :(得分:11)

我今天在Github Yesod Cookbook中添加了一个页面,它将MongoDB与Persistent结合使用。但是,它不使用withMongoDBConn,也不使用TH。另外,我解释为什么我使用单独的YAML配置文件。链接:http://bit.ly/VLvmoK

答案 1 :(得分:3)

我知道这是一个旧问题的答案,但这里有一个Yesod独立的方式来让Persistent与MongoDB一起工作。这可能对其他刚接触Persistent的人有用。

{-# 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