11

HaskellとYesodの初心者はここにいます。私は、Yesodの本(http://www.yesodweb.com/book/persistent)の永続的な章のYesodとの統合の例に従おうとしています。Sqliteはコンパイルされ、正常に実行されるようです。しかし、私はMongDBを使おうとしていて、物事を機能させるのに苦労しています。具体的には:

  1. sqliteの例では:

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

    Yesodの本には、「MongoコードがmongoSettings代わりに使用されます」と書かれています。しかし、どのモジュールでもそれを見つけることができず、コードはコンパイルされません。代わりに、代わりにこれを使用する必要がありましたmongoSettings

    MkPersistSettings { mpsBackend = ConT ''Action }

    コンパイルするにはLanguage.Haskell.TH.Syntaxをインポートする必要がありましたが、これはユーザーから非表示にする必要があると想定しているため、正しく実行されていません。

    また、Mongoの永続テストでは、「共有」と「移行」の部分がないことがわかりました。理由はよくわかりませんが、MongoDBはスキーマがなく、移行の必要がないためだと思いますか?

  2. SqlPersist

    SqlPersistに相当すると思いましたが、ほぼそうだと思います。Persistentのテストディレクトリのinit.hsでMongoPersist1つのインスタンスを見つけました。MongoPersistでもコメントアウトされているので、時代遅れな気がしますか?そうでなければ、私が知る限り、それはとにかく定義されていません。したがって、次の行(YesodブックのP.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の場合、コードは次のようになります(上記のWebページの最初の例):

    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 with MongoDBの具体例を教えてもらえますか?よろしくお願いします。

4

2 に答える 2

11

今日、Github Yesod Cookbookに、永続性と組み合わせてMongoDBを使用するページを追加しました。ただし、withMongoDBConnTHを使用することも、回避することもありません。また、別のYAML構成ファイルを使用する理由についても説明します。リンク: http: //bit.ly/VLvmoK

于 2012-12-17T12:37:32.317 に答える
3

これが古い質問への答えであることは知っていますが、ここにPersistentをMongoDBで動作させるためのYesodに依存しない方法があります。これは、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
于 2014-05-30T16:50:55.173 に答える