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