« Japanize for IE バージョンアップのおしらせ | メイン | Filter::SQL を使って掲示板を書いてみました »

2008年04月16日

Perl で埋め込み SQL を使って楽をする話

 DSL (ドメイン固有言語) は、プログラム開発の生産性を向上させる有力な手段です。そして、よく使われる DSL の代表例が正規表現と SQL だと思うのですが、前者に比して後者を嫌いな人が多いようです。なぜだろうと思ってつぶやいたところ、「SQL はリテラルじゃないから!」という答えが tokuhirom さんから返ってきました。そういえば例えば Pro*C のように C で Embedded SQL というのは良く聞く話なのに、Perl では同様の例がないような感じだったので、作ってみました。Perl で埋め込み SQL を実現するソースフィルター Filter::SQL です。

 Filter::SQL を使えば、以下のように、SQL と perl が混在するプログラムを簡単に書くことができます。EXEC, SELECT, SELECT ROW, INSERT, UPDATE, DELETE からセミコロンまでの間が SQL 文として解釈されます。

use DBI;
use Filter::SQL;

# データベースハンドルを指定
Filter::SQL->dbh(DBI->connect('dbi:mysql:test'))
    or die DBI->errstr;

# テーブルを作ったり消したり
EXEC DROP TABLE IF EXISTS t;;
EXEC CREATE TABLE t (v INT);;

# 値を挿入
for (my $v = 0; $v < 5; $v++) {
  INSERT INTO t (v) VALUES ($v);;
}

# イテレートして値を表示
foreach my $row (SELECT * FROM t;) {
  print "$row[0]\n";
}

# 条件分岐
if (SELECT ROW COUNT(*) FROM t; == 5) {
  print "5 rows in table\n";
}

 Filter::SQL は cpan にアップ済みです。今すぐソースを見たい方は /lang/perl/Filter-SQL - CodeRepos::Share - Trac からどうぞ。

10:52 追記: 素の SQL を埋め込むのではなく、Perl の文法内で SQL っぽく書くためのモジュールとしては、kan さんの SQL::Declare (説明) や DBIx::Perlish があると宮川さん他に教えていただきました。あわせてごらんください。

投稿者 kazuho : 2008年04月16日 10:33 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/1859