Class::DBIのTips

Class::DBIのTips

 Perlでのパフォーマンス計測は気になりますので、何かいい方法があれば知りたいです。普段はabとかwget -rとかDProfでお茶を濁してますが、上手い方法だとは思えないし。

 それはそれとして。

 Class::DBIを使うときは

$class->columns(Essential => @cols);

を明示的に設定しておきましょう。

 Class::DBIのドキュメントではcolumnsにAllを設定すれば*1Essentialに設定されることになっていますが、標準だとPrimaryのカラムしか返しません。

 なので、Primary以外のカラムにアクセスすると余計なqueryを投げることになります。

 これを避けるためには、

$class->columns(Essential => $class->all_columns);

とかしておいたほうがいでしょう*2

 常に全部のカラムを読み出していいのなら、

$class->set_sql(Retrieve => <<'');
SELECT *
FROM   __TABLE__
WHERE  %s

としておくのも手です*3

Class::DBI::ColumnsGroupのバグ?

sub add_group {
	my ($self, $group, @names) = @_;
	$self->add_group(Primary => $names[0])
		if ($group eq "All" or $group eq "Essential")
		and not $self->group_cols('Primary');
	$self->add_group(Essential => @names)
		if $group eq "All"
		and !$self->essential;
	@names = unique($self->primary, @names) if $group eq "Essential";

	my @cols = map $self->add_column($_), @names;
	$_->add_group($group) foreach @cols;
	$self->{_groups}->{$group} = \@cols;
	return $self;
}

となってるので、Allで設定すればEssentialにも設定されそうですが、肝心のessentialが

sub essential {
	my $self = shift;
	my @cols = $self->group_cols('Essential');
	@cols = $self->primary unless @cols;
	return @cols;
}

となっていてprimaryを返しちゃうため、結果的に

	$self->add_group(Essential => @names)
		if $group eq "All"
		and !$self->essential;

が成り立つことはないんですね……。

 ここは

	$self->add_group(Essential => @names)
		if $group eq "All"
		and !$self->group_cols('Essential');

にすべきじゃないのかな?

*1:$class->columns(All => @cols);とすれば。

*2:もちろんEssentialなカラムを選別するのが一番でしょうけど。

*3:僕はこうしてます。