ushumpei’s blog

生活で気になったことを随時調べて書いていきます。

Persistent

Persistentはデータベースアクセスインターフェースを提供するHaskellのパッケージで、DDLDML、などを扱いやすい関数を備えています。

型安全と完結さ、明確な文法という原理に則って開発されていて、PostgreSQLSQLiteMySQL、MongoDBや実験的にRedisもサポートしているそうです。MySQLに関してはjoinをサポートしてい無いそうですが、Esqueletoライブラリによって補完されていると書かれています。また、データベースのマイグレーションも行ってくれるようです。(詳細

データ構造

Persistentはデータベースの構造をどうやってHaskellで表現しているのでしょうか?対応表が載っていたので転記します。

SQL Persistent
Datatypes(VARCHAR, INTEGER, etc) PersistValue
Column PersistField
Table PersistEntity

PersistValueはデータ型、PersistField、PersistEntityは型クラスになっています。

まずは、

Haskell内で記述する必要があるようです。

とりあえず

とりあえずサイトのサンプルを動かしてみます。

{-# LANGUAGE EmptyDataDecls             #-}
{-# LANGUAGE FlexibleContexts           #-}
{-# LANGUAGE GADTs                      #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses      #-}
{-# LANGUAGE OverloadedStrings          #-}
{-# LANGUAGE QuasiQuotes                #-}
{-# LANGUAGE TemplateHaskell            #-}
{-# LANGUAGE TypeFamilies               #-}
import Database.Persist
import Database.Persist.TH
import Database.Persist.Sqlite
import Control.Monad.IO.Class (liftIO)

share [mkPersist sqlSettings, mkSave "entityDefs"] [persistLowerCase|
User
    email    String
    password String
    deriving Show
|]

main :: IO ()
main = runSqlite ":memory:" $ do
    runMigration $ migrate entityDefs $ entityDef (Nothing :: Maybe User)
    hogeId <- insert $ User "hoge@fuga.com" "piyo"
    hoge <- get hogeId
    liftIO $ print hoge

プラグマがよくわかってい無いため、なんとも言えませんが記述する部分はshareの次の行のデータ型定義くらいで済んでるのではないかと思います。もしかしたらリレーションとか考えると複雑になるのかもしれませんが。

感想

途中で力が尽きてしまったので、次はいろいろいじりたい。なんだか中途半端なことが溜まっている気がする。

おまけ:Yesod

YesodはHaskellのWebフレームワークです。Haskellによる、型安全でRESTfulで高性能なWebアプリケーション開発の生産性を向上させる目的を掲げているそうです。

PersistentはYesodに組み込まれているそうです。HaskellのWebフレームワークとしてはかなり有名らしく、githubを見るとすでにバージョンは2.5が出ていました。