2012-07-31 13 views
12

Haskell y Yesod novato aquí. He intentado seguir el ejemplo de Integración con Yesod del capítulo Persistente en el libro de Yesod (http://www.yesodweb.com/book/persistent). El Sqlite compila y funciona bien, parece. Sin embargo, estoy tratando de usar MongDB y estoy teniendo dificultades para hacer que las cosas funcionen. Específicamente:Ejemplo de MongoDB para Yesod/Persistente

  1. En el ejemplo de SQLite: "Mongo código utilizará mongoSettings lugar"

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

    El libro dice Yesod Pero no puedo encontrarlo en ninguno de los módulos, y el código no se compila. Así que en vez, tuve que usar esto en vez de mongoSettings:

    MkPersistSettings { mpsBackend = ConT ''Action }

    tuviera que importar Language.Haskell.TH.Syntax a que se compile, que estoy suponiendo que deben ser ocultados al usuario para Ciertamente no lo estoy haciendo bien.

    Además, encontré que en las pruebas persistentes para Mongo no se incluyen las partes "compartir" y "migrar". De hecho, no estoy seguro de por qué, supongo que es porque MongoDB no tiene Schema y no necesita migración.

  2. SqlPersist

    pensé MongoPersist sería el equivalente a SqlPersist, y supongo que casi es - me encontré con una instancia de MongoPersist en los init.hs en el directorio de prueba del persistente. Pero está comentado, así que tengo la sensación de que está obsoleto. De lo contrario, no está definido de todos modos por lo que puedo decir. Así que no sé cómo convertir la línea siguiente (página 115 del libro Yesod, o cerca del final de http://www.yesodweb.com/book/persistent) a trabajar para MongoDB:

    instance YesodPersist PersistTest where 
        type YesodPersistBackend PersistTest = SqlPersist 
        runDB action = do 
         PersistTest pool <- getYesod 
         runSqlPool action pool 
    
  3. Usando withMongoDBConn

    Así que para SQLite , el código es (1er ejemplo de la página anterior):

    main :: IO() 
    main = withSqliteConn ":memory:" $ runSqlConn $ do 
        runMigration migrateAll 
        johnId <- insert $ Person "John Doe" $ Just 35 
        ... and so on 
    

    Pero

    main :: IO() 
    main = withMongoDBConn ":memory:" $ runMongoDBConn $ do 
        runMigration migrateAll 
        johnId <- insert $ Person "John Doe" $ Just 35 
        ... and so on   
    

no funciona. En primer lugar, runMigration por algún motivo no está en el alcance. De acuerdo, tal vez no necesito migración para MongoDB, así que elimino esa línea. Entonces, el compilador se queja: Couldn't match expected type AccessMode 'con el tipo real m0 b0' Expected type: m0 t0 -> (t0 -> m0 b0) -> AccessMode Actual type: m0 t0 -> (t0 -> m0 b0) -> m0 b0 y así sucesivamente. Y en esta etapa, mi conocimiento superficial de las mónadas no es suficiente para entender esto.

En general, estoy teniendo un momento muy difícil para convertir el ejemplo de Integración con Yesod del libro de Sqlite a MongoDB. ¿Podría alguien proporcionarme un ejemplo concreto de Yesod/Persistent con MongoDB? Muchas gracias de antemano.

+1

Puede usar la herramienta de andamio 'yesod init', generar un sitio MongoDB y ver cómo está configurado. Es difícil decir exactamente qué partes faltan de cómo ha explicado su situación. – dflemstr

+0

Gracias por la sugerencia. Mirar a través de eso ayuda un poco ... aunque en su mayor parte el código resultante en el árbol del directorio es demasiado complejo para que pueda descubrir qué está pasando. Editaré la publicación original para aclarar las cosas. – Victor

Respuesta

11

Agregué hoy una página en el libro de cocina de Github Yesod que usa MongoDB junto con Persistent. Sin embargo, no usa withMongoDBConn, tampoco evita TH. Además, explico por qué utilizo un archivo de configuración YAML separado.El enlace: http://bit.ly/VLvmoK

+0

Este ejemplo debe ser arreglado para el último persistent-mongodb 2.x con: let mongoSettings = (mkPersistSettings (ConT '' MongoContext)) {mpsGeneric = False} –

+0

"MongoBackend" cambiado con "MongoContext" –

3

Sé que esta es una respuesta a una vieja pregunta, pero aquí hay una manera independiente de Yesod de conseguir Trabajo persistente con MongoDB. Esto podría ser útil para otros nuevos en Persistente.

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