DBIx::ClassでのSQL TRACE

最近のWebアプリケーション開発でDBを利用する機会ではO/Rマッパーを利用するケースが多くなっています。開発の効率化などを目的に選択されるWebアプリケーションフレームワークが対応している(ないし利用を前提としている)場合のあるのですが、プログラムコードとSQLが混在により保守性が問題になりうるのですが、そうした問題の解決法の一つと言えるでしょう。

逆にO/Rマッパーを利用することの弱点としては発行されるSQLの内容を把握しにくい・最適化しにくいという点もあるので、DB連携の際にはメリット・デメリットを見極めて色々な選択肢の中から選べるのが理想的です。

PerlでのO/RマッパーはDBIx::Class(以下、DBIC / 日本語訳)が代表的ですが、DBICを利用した際のSQLをトレースする方法をまとめておきます。以下のコードでは連携先のDBはMySQLでの例です。

まずはDBICのスキーマクラス。サンプルコードの簡略化のため、DBIx::Class::Schema::Loaderというモジュールを利用し、自動的にデータベース内の全てのテーブル用のクラスを作っています。

package MyApp::Schema;

use strict;
use warnings;
use base qw(DBIx::Class::Schema::Loader);

__PACKAGE__->loader_options(
    'constraint' => qr(^[A-Z]\w+$),
    'components' => [qw(
        InflateColumn::DateTime
        UTF8Columns
    )],
);
1;

次にMyApp::Schemaを利用する側のサンプルです。

use strict;
use warnings;
use MyApp::Schema;

my $schema = MyApp::Schema->connect(
    '接続先MySQLのDataSource',
    '接続先MySQLのユーザアカウント',
    '上記ユーザアカウントに対応するパスワード'、
);

$schema->storage->debug(1);
$schema->storage->debugfh(
    IO::File->new('トレース・ログのファイルパス', 'w')
);

......

強調した部分がDBICで発行されたSQLをトレースするための箇所です。このコード以降、$schemaを利用したDB連携時のSQLが指定したファイルに記録されます。また、

IO::File->new('トレース・ログのファイルパス', 'w')

の部分ですが、2つ目の引数が’w’の場合は、上書きでトレースします。ログとして前回(以前)の内容も残したい場合は’a’を指定すると追加書き込みで記録されるようになります。

こうした機能を活用して少しでも発行されるSQLの効率化を図っていきたいものですね。