Przykład MongoDB dla Yesod / Persistent
Nowicjusz Haskell i Yesod tutaj. Próbowałem śledzić integrację z przykładem Yesoda z rozdziału Trwałe w książce Yesod (http://www.yesodweb.com/book/persistent). Sqlite się kompiluje i działa dobrze. Jednak staram się korzystać z MongDB i mam trudności z uruchomieniem rzeczy. Konkretnie:
W przykładzie dla sqlite:
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist|
Książka Yesod mówi: „Kod Mongo będzie używanymongoSettings
zamiast tego. „Ale nie mogę go znaleźć w żadnym z modułów, a kod się nie kompiluje. Zamiast tego musiałem go użyć zamiastmongoSettings
:
MkPersistSettings { mpsBackend = ConT ''Action }
Musiałem zaimportować Language.Haskell.TH.Syntax, aby go skompilować, co, jak przypuszczam, powinno być ukryte przed użytkownikiem, więc z pewnością nie robię tego dobrze.
Odkryłem również, że w testach trwałych dla Mongo nie ma części „share” i „migrate”. Właściwie nie jestem pewien, dlaczego tak się dzieje, ponieważ MongoDB jest bez schematu i nie potrzebuje migracji?
SqlPersist
myślałemMongoPersist
byłby odpowiednikiem SqlPersist i myślę, że prawie tak - znalazłem jedno wystąpienieMongoPersist
w init.hs w katalogu testowym Persistent. Ale to jest skomentowane, więc mam wrażenie, że jest przestarzałe? W przeciwnym razie tak czy inaczej nie jest to zdefiniowane. Więc nie wiem, jak przekonwertować następującą linię (str.115 książki Yesod lub pod koniechttp://www.yesodweb.com/book/persistent) pracować dla MongoDB:
instance YesodPersist PersistTest where
type YesodPersistBackend PersistTest = SqlPersist
runDB action = do
PersistTest pool <- getYesod
runSqlPool action pool
Używanie withMongoDBConn
Tak więc dla sqlite kod jest (pierwszy przykład ze strony powyżej):
main :: IO ()
main = withSqliteConn ":memory:" $ runSqlConn $ do
runMigration migrateAll
johnId <- insert $ Person "John Doe" $ Just 35
... and so on
Ale
main :: IO()
main = withMongoDBConn ":memory:" $ runMongoDBConn $ do
runMigration migrateAll
johnId <- insert $ Person "John Doe" $ Just 35
... and so on
nie działa. Po pierwsze,runMigration
z jakiegoś powodu nie ma zakresu. Dobra, może nie potrzebuję migracji dla MongoDB, więc usuwam tę linię. Następnie kompilator skarży się:Couldn't match expected type
AccessMode 'z aktualnym typemm0 b0' Expected type: m0 t0 -> (t0 -> m0 b0) -> AccessMode Actual type: m0 t0 -> (t0 -> m0 b0) -> m0 b0
i tak dalej. I na tym etapie moja bardzo pobieżna znajomość monad nie wystarczy, żeby to zrozumieć.
Ogólnie rzecz biorąc, mam naprawdę trudny czas na konwersję przykładu Integracja z Yesod z książki Sqlite na MongoDB. Czy ktoś mógłby mi podać konkretny przykład Yesod / Persistent z MongoDB? Z góry dzięki.