« 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:
https://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/1859