UbuntuでHaskellでmongoDB

  • 6
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

~ HaskellでJSON Web APIを作ると幸せになれるかもよ ~を見て scotty + aeson + persistent 環境を作りたくなって勉強してます。なんとなくわかってきたのと、kobitoを使ってみようと思ったのでメモ。

注) Haskell初心者で、H本読み終えたぐらいの知識しかありませんので、そのつもりで読んでいただけると助かります。

環境

  • Ubuntu 12.10 on VMWare Fusion (Mac)

インストールライブラリ

import Database.Persist.THするのにpersistent-templateインストールしなきゃいけなく、だいぶ時間ロスりました。。。

モデル定義

Model.hs
{-# LANGUAGE QuasiQuotes, OverloadedStrings, TypeFamilies #-}
{-# LANGUAGE TemplateHaskell, FlexibleContexts, GADTs #-}

module Model where

import Database.Persist.MongoDB
import Database.Persist.TH
import Database.Persist.Quasi

mkPersist sqlSettings [persist|
User
    name String
    password String
    deriving Show 
|]

とりあえずUserの定義はこんな感じでいけました。

データ生成 (insert)

Main.hs
{-# LANGUAGE OverloadedStrings #-}

import Model
import Database.Persist.MongoDB
import Data.Time.Clock
import Network
import qualified Data.Text as T

main = withMongoDBConn dbname hostname port' Nothing time $ runMongoDBPoolDef $ do
    insert $ User { userName     = "hogehoge"
                  , userPassword = "hogepass" }
    return ()
    where
        dbname = T.pack "dbname" :: Database
        hostname = "ubuntu" :: HostName
        port' = PortNumber 27017 :: PortID
        time = 3600 :: NominalDiffTime

よくわからないのはwithMongoDBConnrunMongoDBPoolDefでしょうか。
定義を見ると、

withMongoDBConn :: (MonadIO m, Applicative m) => Database -> HostName -> PortID -> Maybe MongoAuth -> NominalDiffTime -> (ConnectionPool -> m b) -> m b

runMongoDBPoolDef :: (MonadIO m, MonadBaseControl IO m) => Action m a -> ConnectionPool -> m a

となってます。withMongoDBConnConnectionPool -> m bのとこにrunMongoDBPoolDefを差し込みました。(型合わせると動いてしまったって感じですが良いんでしょうかw)

参考

  • Persistent - Yesod 本家persistent解説 - 英語苦手ってのとSQLiteの記述が主なので避けてましたが、結局ここ見ないとわからないですねw