Haskell Relational Record (HRR)尻叩き担当の山本です。この記事では、HRR のリリースについて説明します。
なお、これは Haskell Advent Calendar 2014 の25日目の記事です。
HRR とは何か?
HRRは、日比野さんが中心となって開発が進められている関係代数ライブラリです。Haskellで式を書くと、それがSQL文に変換され、データベースに問い合わせた結果が Haskell のレコードになります。以下のような特長があります。
- 抽象的:高レベルな式で表現すると、SQLが生成されます。対応している SQLサーバは、DB2、ProsgreSQL、SQLite、MySQL、MicroSoft SQL Server および OracleSQL です。
- 型安全:HRRの式を書いたHaskellのコードがコンパイルできれば、必ず正しいSQL文が生成されます。プレースホルダーにも型が付きます。
- 合成可能:式を合成して、より大きな式を作成できます。
- 自動的:コンパイル時に目的のデータベースへ問い合わせて、SQLスキーマを自動的に取得し、レコードの定義を自動生成します。
HRRはASAHIネットの内部システムで1年以上稼働しており、その品質は安定しています。
リリース合宿
本当なら、1年前、日比野さんが Haskell Advent Calendar 2013 の記事を書いたころに、HRR をリリースすべきだったのですが、多忙に負けてできませんでした。最近では、ヨーロッパ方面からもリリースの要望が出るようになっていました。そこで、12月11日から12日の間、山本が住んでいるマンションのゲストルームを借りて、日比野さん、多大な貢献をしている村山さん、そして山本の三人で合宿を張まりました。
合宿までの宿題
合宿までに HRR を Hackage に登録するように日比野さんにお願いしました。バラバラになっている貢献されたコードをかき集め、形を整えて Hackage に登録する作業は、とても大変だったそうです。
リリースするということは、マニュアルを書かないといけません。昔からチュートリアルも書こうという話をしていました。チュートリアルでは、直接SQLで書くような難しいことも書けることを示すために、実践的な例題を載せたいと思っていました。その例題は、実際のデータベースに対して動くべきです。
そこで、「初めてのSQL」に載っているSQLをHRRで書いちゃえ作戦が一年前から始まっていました。当時のHRRは、オープンソースの SQL データベースサーバとして PostgreSQL しかサポートしていませんでした。一方で「初めてのSQL」は、MySQL を前提としています。サポートページで提供されているテーブルを生成するスクリプトは、当然のように PostgreSQL では動きません。そこで昨年、山本が PostgreSQL 用に書き直し、例題のテーブルを作成するようにしました。また、そのテーブルに対して動くSQLをいくつか選定しました。それを村山さんが HRR に変換してくれていました。
今回チュートリアルの作業を再開するにあたり、山本がPostgreSQLの動かし方をすっかり忘れていたこと、そして HRR が SQLite をサポート済みだったことから、MySQL 用のスクリプトを今度は SQLite 用に書き直しました。SQLite を使ってチュートリアルを書く方が、断然敷居が下がるからです。
村山さんは、古くなっていたHRRの例題をSQLiteで動くようにする作業をしました。SQLite には、例えば日付リテラルがありません。あればちゃんと型が付くのですが、ないので文字列操作で誤魔化す必要があるのです。
合宿1日目
HRRのプロジェクトページの作成には、github Page を使うことにしました。そしてコンテンツとしては、クイックスタート、チュートリアル、例題集、およびマニュアルを置くことにしました。
1日目の成果として、HRRのプロジェクトページとクイックスタートができました。クイックスタートでは、式が合成できることを見せたかったので、式 hello と world を使って helloWorld を構築できることを示しました。
合宿2日目
チュートリアルができました。1年遅れたのは悪いことですが、そのおかげで SQLiteを使って説明できました。あれこれ説明する必要はまったくなくなりました。たとえば、例題を動かした後にテーブルを消したくなったら、単にファイルを消せばよいのです。
リリース
そして、ついに日比野さんがhaskell-cafe に対してリリースのアナウンスをしました。
例題の更新
例題を更新しようとしています。挿入、更新、削除、および相関サブクエリなどを増やす予定です。