Haskell 和 Yesod 新手在这里。我一直在尝试遵循 Yesod 书 (http://www.yesodweb.com/book/persistent) 中 Persistent 章节中的与 Yesod 集成的示例。Sqlite 似乎编译并运行良好。但是,我正在尝试使用 MongDB 并且很难让事情正常工作。具体来说:
在 sqlite 的示例中:
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist|
Yesod 书说“将使用 Mongo 代码
mongoSettings
”。但是我在任何模块中都找不到它,并且代码无法编译。所以相反,我不得不使用它而不是mongoSettings
:MkPersistSettings { mpsBackend = ConT ''Action }
我必须导入 Language.Haskell.TH.Syntax 才能编译它,我假设它应该对用户隐藏,所以我肯定没有做对。
此外,我发现在 Mongo 的持久测试中没有“共享”和“迁移”部分。我实际上不确定为什么,我猜这是因为 MongoDB 是无模式的并且不需要迁移?
SqlPersist
我以为
MongoPersist
是 SqlPersist 的对应物,我猜它几乎是——我MongoPersist
在 Persistent 的测试目录的 init.hs 中找到了一个实例。但是它被注释掉了,所以我觉得它已经过时了?否则,据我所知,它无论如何都没有定义。所以我不知道如何转换以下行(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
使用 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
不起作用。首先,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
等等。到了这个阶段,我对单子的粗略了解还不足以弄清楚这一点。
总而言之,我很难将书中的集成与 Yesod 示例从 Sqlite 转换为 MongoDB。有人可以为我提供一个使用 MongoDB 的 Yesod/Persistent 的具体示例吗?非常感谢提前。