簡単Webプログラミング!
SQLite3インストール!
Gaucheは、RDB(リレーショナルデータベース)に依存しないデータベースインタフェース(dbi)モジュールを持っています。各RDB用にデータベースドライバ(dbd)モジュールを用意することで、GaucheからRDBを扱えます、現在、MySQL、PostgreSQL、SQLite3などのデータベースドライバモジュールがあります。
今回使うSQLite(http://www.sqlite.org/)は組み込み型RDBで、サーバ管理などが不要なため、扱いやすいのが特徴です。
Linuxでは、パッケージ管理ソフト(apt、yum、rpmなど)でインストールするのが良いでしょう。Mac OS/XにはSQLite3がプリインストールされてます。
Windows(cygwin)では、第1回でGaucheをインストールしたcygwinインストーラーを使ってインストールできます。SelectPackages画面でDatabaseカテゴリにある「libsqlite3_0: Embeddate SQL database engine」「sqlite3: Embeddable SQL database engine」の2つを、Skipからインストール(バージョン番号が表示された)状態にしてインストールを実行してください。
では、SQLite3用データベースドライバモジュールのインストールをしていきましょう。まず、SQLite3用データベースドライバ(7471.zip)をダウンロードします。このSQLite3用データベースドライバは「Gauche-dbd.sqlite3(http://uchizono.com/wiki/wiliki.cgi?Gauche-dbd.sqlite3)」に筆者が独自の改造を加えたものです。オリジナル版作者に感謝しています。
ダウンロードしたファイルを展開し、以下の手順でインストールしてください。
1. cd gauche-dbd.sqlite3
2. ./configure
3. make
4. make install ※ 環境によっては sudo make install
また、SQLite3で使うサンプルのデータを用意しました。(7402.zip)をダウンロードし、展開するとalih.sqlファイルができます。Cygwin Bash Shell、またはshellで「sqlite3 alih.db
このデータはアジアリーグアイスホッケー(http://www.alhockey.jp/)の個人成績から引用させていただきました。
RDBプログラミング
では、Gaucheを使った簡単なRDBプログラミングを行ってみます(図1)。図1のプログラムを実行すると、フォワード選手の一覧をゴール数の多い順に背番号、名前、ゴール数を表示します。プログラムについて解説していきましょう。
1行目はdbiモジュールの読み込みです。2行目はコレクションモジュールの読み込みです。コレクションモジュールはJavaのコレクションフレームワーク(java.util.Listなど)と同様のもので、配列、リストなどを統一的に扱えます。
「(define (print-goal)・・・」がフォワード選手の一覧を表示する関数の定義です。
let*は第1引数でローカル変数を定義してから、第2引数以降の引数を実行する関数です。ここではconn,res getterが変数となります。これらの変数の後ろにある式の値が代入されます。その後、for-each、dbi-closeなどの式が評価されます。その際に、letで定義した変数が使えます。letという同じような関数もあります、letでは変数定義の順は不定ですが、let*は変数定義を最初から順に評価していきます。ですので最初に定義した変数を次の式の中で使えます。
dbi-connはRDBへの接続を行う関数で、コネクションオブジェクトが戻ります。db-doはSQL文を実行する関数で、SELECT文を実行した場合は結果のコレクションが戻ります。
relation-accessorは結果セットをカラム名でアクセスできる関数を戻してくれます。for-eachは第2引数のコレクションの各要素に対して、第1引数の関数を実行してくれます。ここではSELECT文の全結果を表示しています。
lambdaは他の言語では無名関数などと呼ばれているものです(本連載ではSchemeの深淵な部分には立ち入りません)。ここでは引数rowを受け取り、(format...)式を評価しています。
formatは書式を指定してきれいに表示する関数で、CやJavaのprintf関数と同様のものです、書式の詳細はGaucheのリファレンスマニュアルを参照してください。
getter関数は1つのSELECT結果からカラム名を指定して値を取り出しています。dbi-closeはRDBへの接続を閉じます。
最後に注意点として、本プログラムはエラー処理などを省略しています。実際のシステムに適用する場合は、guard(http://practical-scheme.net/gauche/man/?l=jp&p=guard)などで例外処理を追加してください。