« 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