LoginSignup
10
8

More than 5 years have passed since last update.

UbuntuでHaskellでmongoDB

Posted at

~ 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
10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8