« Greasemetal 0.2 をリリースしました | メイン | ウェブサービスにおける SSD 導入にむけて〜検索サービスの可能性 »

2008年10月17日

Filter::SQL でデータベースを叩くワンライナーを簡単に書く方法

 Perl と SQL を使ってワンライナーを書くことが多いのですが、いろいろ面倒なことが多かったので、以前作成したお気に入りのモジュール Filter::SQL を改良してみました。

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

Kazuho@Cybozu Labs: Perl で埋め込み SQL を使って楽をする話

 先ほどリリースした Filter::SQL 0.09 から、環境変数 FILTER_SQL_DBI を使用して接続先の DBI URI を設定することができるようになりました。この点を利用すれば、例えば、単純な SELECT を行うワンライナーは perl を利用して以下のように書くことができます。

% FILTER_SQL_DBI='dbi:mysql:test;user=****' perl -MFilter::SQL -le 'print $_->[0] for SELECT id FROM tbl;'
1
3
8
...

 もちろん単純な SELECT を行うケースでは、RDBMS のコマンドラインクライアントを使えばいいのですが、perl のループ内でさらに SELECT を発行したり、あるいは保守目的で UPDATE を行ったりする場合は便利かなと思います。あと、ついでに mysql_insert_id も取得できるようにしました。以下のような感じで書くことが可能です。

use Filter::SQL qw(:mysql);
...
INSERT INTO tbl (str) VALUES ('abc');;
print mysql_insert_id(), "\n";

 Filter::SQL 0.09 は、まだリリースしたてのほやほやなので、CPAN からはダウンロードできないかもしれません。最新のソースコードは、CodeRepos の lang/perl/Filter-SQL 以下にあるので、興味のある方はこちらをご覧ください。

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

トラックバック

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