Yesod/持久的 MongoDB 示例

2024-01-11

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

  2. SqlPersist

    我想MongoPersist将是 SqlPersist 的对应部分,我想它几乎就是——我发现了一个实例MongoPersistPersistent的test目录下的init.hs中。但它被注释掉了,所以我感觉它已经过时了?否则,据我所知,它还没有被定义。所以我不知道如何转换以下行(Yesod书的P.115,或接近结尾处)http://www.yesodweb.com/book/persistent 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
    

    But

    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等等。到了这个阶段,我对单子的粗略了解还不足以弄清楚这个问题。

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


我今天在 Github Yesod Cookbook 中添加了一个页面,该页面将 MongoDB 与 Persistent 结合使用。然而,它不使用withMongoDBConn,也没有避免 TH。另外,我还解释了为什么我使用单独的 YAML 配置文件。链接:https://github.com/yesodweb/yesod/wiki/Non-scaffolded-MongoDB-App https://github.com/yesodweb/yesod/wiki/Non-scaffolded-MongoDB-App

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Yesod/持久的 MongoDB 示例 的相关文章

随机推荐