YesSOD/Persistent的MongoDB示例
Haskell和Yesod是这里的新手。我一直在尝试遵循Yesod书中持续章节中的与Yesod集成的示例(http://www.yesodweb.com/book/persistent). Sqlite编译和运行似乎很好。然而,我正在尝试使用MongDB,并且很难让它正常工作。具体而言:YesSOD/Persistent的MongoDB示例,mongodb,haskell,persistent,yesod,Mongodb,Haskell,Persistent,Yesod,Haskell和Yesod是这里的新手。我一直在尝试遵循Yesod书中持续章节中的与Yesod集成的示例(http://www.yesodweb.com/book/persistent). Sqlite编译和运行似乎很好。然而,我正在尝试使用MongDB,并且很难让它正常工作。具体而言: 在sqlite的示例中: share[mkPersist sqlSettings,mkMigrate“migrateAll”][persist | Yesod的书上说“Mongo代码将使用mongoSetti
share[mkPersist sqlSettings,mkMigrate“migrateAll”][persist |
Yesod的书上说“Mongo代码将使用mongoSettings
”。但我在任何模块中都找不到它,代码也无法编译。因此,我不得不使用它而不是mongoSettings
:
MkPersistSettings{mpsBackend=ConT''Action}
我必须导入Language.Haskell.TH.Syntax来编译它,我假设它应该对用户隐藏,所以我肯定做得不对
另外,我发现在Mongo的持久性测试中没有“共享”和“迁移”部分。我不知道为什么,我猜这是因为MongoDB没有模式,不需要迁移SqlPersist
我原以为MongoPersist
会与SqlPersist相对应,我猜几乎是这样——我在persist的测试目录init.hs中找到了MongoPersist
的一个实例。但是它被注释掉了,所以我觉得它过时了?否则就我所知,它没有定义。所以我不知道如何使用c转换以下行(Yesod书第115页,或接近结尾)为MongoDB工作:
instance YesodPersist PersistTest where
type YesodPersistBackend PersistTest = SqlPersist
runDB action = do
PersistTest pool <- getYesod
runSqlPool action pool
实例YesDopTest,其中
类型YesodPersistBackend PersistTest=SqlPersist
runDB action=do
持久化测试池(t0->M0B0)->访问模式
实际类型:M0T0->(t0->M0B0)->M0B0
等等。到了这个阶段,我对单子的粗略了解还不足以理解这个
总而言之,我很难将与Yesod的集成示例从Sqlite转换为MongoDB。有人能为我提供一个与MongoDB的Yesod/Persistent的具体示例吗?非常感谢。我今天在Github Yesod Cookbook中添加了一个页面,该页面将MongoDB与Persiste结合使用但是,它没有在MongoDBConn中使用
,也没有避免使用TH。另外,我在这里解释了为什么我使用单独的YAML配置文件。链接:我知道这是对一个老问题的回答,但是这里有一个独立的方法来获得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
{-#语言模板haskell}
导入数据库。持久化
导入Database.Persist.TH
导入Database.Persist.MongoDB
导入网络(PortID(PortNumber))
让mongoSettings=(mkPersistSettings(ConT'MongoBackend)){mpsGeneric=False}
共享[mkPersist mongoSettings][persist小写|
人
名称字符串
也许是年龄
衍生节目
博客帖子
标题字符串
作者人格
衍生节目
|]
runDBActions操作=
使用MongoDBCONN“myDatabaseName”“localhost”(端口号27017)无任何2000$\pool->
runMongoDBPool主操作池
动作=做
mkey您可以使用yesod init
scaffolding工具,生成一个MongoDB站点并查看其配置情况。很难从您如何解释您的情况中准确判断缺少哪些部分。感谢您的建议。查看这一点会有所帮助…尽管大部分代码都在目录树中太复杂了,我无法弄清楚到底发生了什么。我将编辑原始帖子以澄清问题。对于最新的持久化mongodb 2.x,应使用以下方法修复此示例:let mongoSettings=(mkPersistSettings(ConT'MongoContext)){mpsGeneric=False}“MongoBackend”改为“MongoContext”
main :: IO()
main = withMongoDBConn ":memory:" $ runMongoDBConn $ do
runMigration migrateAll
johnId <- insert $ Person "John Doe" $ Just 35
... and so on
{-# 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