Haskell и Yesod новичок здесь. Я пытаюсь выполнить интеграцию с примером Есода из главы Persistent в книге Yesod (http://www.yesodweb.com/book/persistent). Sqlite компилируется и работает отлично. Тем не менее, я пытаюсь использовать MongDB, и мне сложно с трудом работать. В частности:
-
В примере для sqlite:
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist|
В книге Есода говорится, что "Mongo code будет использовать
mongoSettings
". Но я не могу найти его ни в одном из модулей, и код не компилируется. Поэтому вместо этого мне пришлось использовать это вместоmongoSettings
:MkPersistSettings { mpsBackend = ConT ''Action }
Мне пришлось импортировать Language.Haskell.TH.Syntax для его компиляции, который я предполагаю, должен быть скрыт от пользователя, поэтому я, конечно, не делаю этого правильно.
Кроме того, я обнаружил, что в постоянных тестах для Mongo обойтись без части "share" и "migrate". Я действительно не знаю, почему, я предполагаю, потому что MongoDB не имеет схемы и не нуждается в миграции?
-
SqlPersist
Я думал, что
MongoPersist
будет аналог SqlPersist, и я думаю, что это почти есть - я нашел один экземплярMongoPersist
в init.hs в тестовом каталоге Persistent. Но это прокомментировало, так что у меня такое чувство, что оно устарело? В любом случае, это не определено, насколько я могу судить. Поэтому я не знаю, как преобразовать следующую строку (P.115 книги Yesod или ближе к концу 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
и т.д. И на этом этапе мое очень скудное знание монад просто недостаточно, чтобы понять это.
В целом, мне очень сложно преобразовать интеграцию с примером Йесода из книги из Sqlite в MongoDB. Может ли кто-нибудь, пожалуйста, предоставить мне конкретный пример Yesod/Persistent с MongoDB? Большое спасибо заранее.