MongoDB-Beispiel für Yesod / Persistent
Haskell und Yesod Neuling hier. Ich habe versucht, das Beispiel für die Integration mit Yesod aus dem Kapitel Persistent im Yesod-Buch (http://www.yesodweb.com/book/persistent) zu verfolgen. Das Sqlite kompiliert und läuft anscheinend einwandfrei. Ich versuche jedoch, MongDB zu verwenden, und es fällt mir schwer, die Dinge zum Laufen zu bringen. Speziell:
Im Beispiel für SQLite:
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist|
Das Yesod-Buch sagt: "Mongo-Code wird verwendetmongoSettings
Stattdessen. "Aber ich kann es in keinem der Module finden und der Code wird nicht kompiliert. Also musste ich stattdessen dieses verwendenmongoSettings
:
MkPersistSettings { mpsBackend = ConT ''Action }
Ich musste Language.Haskell.TH.Syntax importieren, um es zum Kompilieren zu bringen. Ich gehe davon aus, dass es vor dem Benutzer verborgen sein sollte, damit ich es nicht richtig mache.
Außerdem habe ich festgestellt, dass in den Persistent-Tests für Mongo auf den Teil "Teilen" und "Migrieren" verzichtet wird. Ich bin mir eigentlich nicht sicher, warum, ich vermute, es liegt daran, dass MongoDB Schema-frei ist und keine Migration benötigt?
SqlPersist
ich dachteMongoPersist
wäre das Gegenstück zu SqlPersist, und ich denke, es ist fast so - ich habe eine Instanz von gefundenMongoPersist
in der init.hs im Testverzeichnis von Persistent. Aber es ist auskommentiert, also habe ich das Gefühl, es ist veraltet? Ansonsten ist es sowieso nicht definiert, soweit ich das beurteilen kann. Ich weiß also nicht, wie ich die folgende Zeile konvertieren soll (S.115 des Yesod - Buches oder kurz vor dem Ende vonhttp://www.yesodweb.com/book/persistent) für MongoDB arbeiten:
instance YesodPersist PersistTest where
type YesodPersistBackend PersistTest = SqlPersist
runDB action = do
PersistTest pool <- getYesod
runSqlPool action pool
Verwenden mit MongoDBConn
Für sqlite lautet der Code also (1. Beispiel von der obigen Webseite):
main :: IO ()
main = withSqliteConn ":memory:" $ runSqlConn $ do
runMigration migrateAll
johnId <- insert $ Person "John Doe" $ Just 35
... and so on
Aber
main :: IO()
main = withMongoDBConn ":memory:" $ runMongoDBConn $ do
runMigration migrateAll
johnId <- insert $ Person "John Doe" $ Just 35
... and so on
funktioniert nicht Erst einmal,runMigration
Aus irgendeinem Grund ist nicht im Umfang. Okay, vielleicht brauche ich keine Migration für MongoDB, also entferne ich diese Zeile. Dann beschwert sich der Compiler:Couldn't match expected type
AccessMode 'mit aktuellem Typm0 b0' Expected type: m0 t0 -> (t0 -> m0 b0) -> AccessMode Actual type: m0 t0 -> (t0 -> m0 b0) -> m0 b0
und so weiter. Und zu diesem Zeitpunkt reicht mein sehr flüchtiges Wissen über Monaden einfach nicht aus, um dies herauszufinden.
Alles in allem fällt es mir sehr schwer, das Beispiel Integration mit Yesod aus dem Buch von Sqlite nach MongoDB zu konvertieren. Könnte mir bitte jemand ein konkretes Beispiel für Yesod / Persistent mit MongoDB geben? Vielen Dank im Voraus.