« 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