Posted at

UbuntuでHaskellでmongoDB

More than 5 years have passed since last update.

~ 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