Haskellでデータベース操作
(2009.5.11 新規作成。)
Haskellのパッケージシステム (Cabal)
HaskellにはCabalというパッケージシステムがあります。RubyでいうRubyGemsのようなものです。
Fedora 10 LinuxのGHCにはCabalシステムは含まれますが、コマンドとしてのcabal (cabal-installツール) は含まれないため、別途インストールします。
cabal-installのインストール
次のサイトのDownload のページから、cabal-install をダウンロードします。2009.4現在の最新版はバージョン0.6.2です。
展開して、一般ユーザで bootstrap.sh を実行するだけでOKです。~/.cabal/bin にcabalコマンドがインストールされます。
個別のパッケージは、
で探します。各パッケージのページにソースコードが置いてありますが、cabalコマンドが自動で取ってきてくれるので、自分でダウンロードする必要はありません。cabalコマンド
パッケージをインストールするときは、次のようにします。--dry-runを付けると何が行われるか表示されるだけで、実際にインストールはされません。
$ cabal install HDBC-postgresql --dry-run
内容を確認してから、--dry-runオプションなしで実行します。
Haskellでデータベース
HaskellからRDBMSを操作するライブラリには次のものがあります。
- haskelldb: SQL unwrapper for Haskell
- SQLを使わず、Haskellの文法で書く
- hsql: Simple library for database access from Haskell
- 文字列でSQLを与える
- Haskell Database Connectivity (HDBC)
- 文字列でSQLを与える。DBIに似た感じ。
hsqlとHDBCは、直接SQLを書くもので、似ています。
見たところ、hsqlはplaceholder の書き方が分からなかったため、HDBCのほうがよさそうです。
HDBC
データベースに接続し、テーブルを作って行を挿入するサンプルを書いてみます。コンパイルは次のようにします。
$ ghc -package HDBC-sqlite3 db.hs
- import Database.HDBC
- import Database.HDBC.Sqlite3
- main = do
- -- データベースへの接続はRDBMS依存.
- conn <- connectSqlite3 "test.db"
- run conn "CREATE TABLE foo (a int primary key, b varchar(100));" []
- -- 引数はそれぞれtoSqlを付ける。
- run conn "INSERT INTO foo VALUES (?, ?)" [toSql (1::Int), toSql "hoge"]
- -- 自動コミットではない
- commit conn
SQL文に埋め込む値はそれぞれtoSqlを付けます。
Haskellではあるリストの要素は同じ型でなければなりませんが、埋め込む値はそれぞれ違う型ですし、SQLにはナル値があったりもします。
toSqlは次の型を持ち、SqlValue型に揃えます。
- Database.HDBC.toSql ::
- (Data.Convertible.Base.Convertible a Database.HDBC.SqlValue.SqlValue) =>
- a -> Database.HDBC.SqlValue.SqlValue
型を実行時にしか見ないスクリプト言語に比べるとちょっと面倒ではあります。
haskelldb
Haskellでは演算子を自由に定義できることを活かして、HaskellのコードをSQLにマップするライブラリです。
SQLを実行しなくても、Haskellのコンパイル時にSQLの誤りを検出できます。
TODO: サンプル、説明を追加。