~ HaskellでJSON Web APIを作ると幸せになれるかもよ ~を見て scotty + aeson + persistent 環境を作りたくなって勉強してます。なんとなくわかってきたのと、kobitoを使ってみようと思ったのでメモ。
注) Haskell初心者で、H本読み終えたぐらいの知識しかありませんので、そのつもりで読んでいただけると助かります。
環境
- Ubuntu 12.10 on VMWare Fusion (Mac)
インストールライブラリ
- haskell-platform
- persistent (1.1.4)
- persistent-mongodb (1.1.5.1)
- persistent-template (1.1.2.1)
- aeson (0.6.1.0) *今回は必要なし
- scotty (0.4.6) ※今回は必要なし
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
よくわからないのはwithMongoDBConn
とrunMongoDBPoolDef
でしょうか。
定義を見ると、
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
となってます。withMongoDBConn
のConnectionPool -> m b
のとこにrunMongoDBPoolDef
を差し込みました。(型合わせると動いてしまったって感じですが良いんでしょうかw)
参考
- Persistent - Yesod 本家persistent解説 - 英語苦手ってのとSQLiteの記述が主なので避けてましたが、結局ここ見ないとわからないですねw