【问题标题】:MongoDB Example for Yesod / PersistentYesod / Persistent 的 MongoDB 示例
【发布时间】:2012-07-28 17:42:48
【问题描述】:

Haskell 和 Yesod 新手在这里。我一直在尝试遵循 Yesod 书 (http://www.yesodweb.com/book/persistent) 中 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 的持久测试中没有“共享”和“迁移”部分。我其实不知道为什么,我猜是因为 MongoDB 是 Schema-less 并且不需要迁移?

  2. SqlPersist

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

    所以对于 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          
    

不起作用。首先,runMigration 出于某种原因不在范围内。好的,也许我不需要迁移 MongoDB,所以我删除了该行。然后,编译器抱怨: Couldn't match expected typeAccessMode' 与实际类型 m0 b0' Expected type: m0 t0 -> (t0 -> m0 b0) -> AccessMode Actual type: m0 t0 -> (t0 -> m0 b0) -> m0 b0 等等。到了这个阶段,我对 monad 的粗略了解还不足以弄清楚这一点。

总而言之,我很难将书中的与 Yesod 集成示例从 Sqlite 转换为 MongoDB。有人可以为我提供一个使用 MongoDB 的 Yesod/Persistent 的具体示例吗?非常感谢。

【问题讨论】:

  • 您可以使用yesod init 脚手架工具,生成一个 MongoDB 站点并查看它是如何配置的。很难从你解释你的情况的方式中准确地说出哪些部分缺失。
  • 感谢您的建议。浏览一下会有所帮助……尽管在大多数情况下,目录树中的结果代码太复杂了,我无法弄清楚发生了什么。我将编辑原始帖子以澄清事情。

标签: mongodb haskell persistent yesod


【解决方案1】:

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

【讨论】:

  • 这个例子应该为最新的 persistent-mongodb 2.x 修复: let mongoSettings = (mkPersistSettings (ConT ''MongoContext)) {mpsGeneric = False}
  • “MongoBackend”更改为“MongoContext”
【解决方案2】:

我知道这是对一个老问题的回答,但这是一种独立于 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

【讨论】:

    猜你喜欢
    • 2015-10-22
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    相关资源
    最近更新 更多