Подтвердить что ты не робот

Пример MongoDB для Yesod/Persistent

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? Большое спасибо заранее.

4b9b3361

Ответ 1

Я добавил страницу в кулинарной книге Github Yesod сегодня, которая использует MongoDB в сочетании с Persistent. Однако он не использует withMongoDBConn, и он не избегает TH. Кроме того, я объясню, почему я использую отдельный файл конфигурации YAML. Ссылка: http://bit.ly/VLvmoK

Ответ 2

Я знаю, что это ответ на старый вопрос, но здесь есть независимый способ Yesod, чтобы получить постоянную работу с MongoDB. Это может быть полезно для других, новых для Persistent.

{-# 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