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