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