Persistent
Persistentはデータベースアクセスインターフェースを提供するHaskellのパッケージで、DDL、DML、などを扱いやすい関数を備えています。
型安全と完結さ、明確な文法という原理に則って開発されていて、PostgreSQL、SQLite、 MySQL、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
が出ていました。