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

Новичок в Haskell и Yesod. Я пытался следовать примеру интеграции с Yesod из главы Persistent в книге Yesod (http://www.yesodweb.com/book/persistent).. Кажется, что Sqlite компилируется и работает нормально. Тем не менее, я пытаюсь использовать MongDB, и мне трудно заставить все работать. В частности:

  1. В примере для sqlite:

    share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist|

    В книге Yesod говорится: «Вместо этого код Mongo будет использовать mongoSettings». Но я не могу найти его ни в одном из модулей, и код не компилируется. Поэтому вместо этого мне пришлось использовать это вместоmongoSettings:

    MkPersistSettings { mpsBackend = ConT ''Action }

    Мне пришлось импортировать Language.Haskell.TH.Syntax, чтобы его скомпилировать, что, как я предполагаю, должно быть скрыто от пользователя, поэтому я определенно делаю это неправильно.

    Кроме того, я обнаружил, что в тестах Persistent для Mongo обходятся без части «поделиться» и «мигрировать». Я на самом деле не уверен, почему, я предполагаю, что это потому, что MongoDB меньше схемы -и не нуждается в миграции?

  2. SqlPersist

    Я думал, что MongoPersistбудет аналогом SqlPersist, и я думаю, что это почти так. --Я нашел один экземпляр MongoPersistв init.hs в тестовом каталоге Persistent. Но это закомментировано, поэтому у меня есть ощущение, что оно устарело? В противном случае, насколько я могу судить, он все равно не определен. Поэтому я не знаю, как преобразовать следующую строку (, стр. 115 книги Йесод, или ближе к концуhttp://www.yesodweb.com/book/persistent)работать в MongoDB:

    instance YesodPersist PersistTest where
        type YesodPersistBackend PersistTest = SqlPersist
        runDB action = do
            PersistTest pool <- getYesod
            runSqlPool action pool
    
  3. Использование withMongoDBConn

    Итак, для sqlite код (1-й пример с веб-страницы выше):

    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 typeAccessMode' с фактическим типом m0 b0' Expected type: m0 t0 -> (t0 -> m0 b0) -> AccessMode Actual type: m0 t0 -> (t0 -> m0 b0) -> m0 b0и так далее. И на этом этапе моего очень поверхностного знания монад просто недостаточно, чтобы понять это.

В целом,Мне очень трудно преобразовать пример интеграции с Yesod из книги из Sqlite в MongoDB. Может ли кто-нибудь предоставить мне конкретный пример Yesod/Persistent с MongoDB? Большое спасибо заранее.

12
задан Victor 31 July 2012 в 18:17
поделиться