DBIx::Customのwhere節

bindするデータタイプを指定したくてDBIx::Simple 1.35からDBIx::Custom 0.3に移行したのだが、where節に単純な条件しか指定できないことに気づいた。

$where{field_a} = [
    undef,
    { '!=' => $value },
];

を渡すと、
field_a is null or field_a != ? ではなく
field_a in (?, ?) になってしまう。ソースを見たところ渡すデータ構造の問題ではなく、実装が限られており完全一致のみ可能の模様。SQL文を直接指定するしかない。
ただ他にも条件が加わることがあり文を自分で組み立てるのは本末転倒になる。そこでDBIx::Simpleの使っているSQL::Abstract 1.77を使うことにした。

my ($where, @whereParams) = SQL::Abstract->new()->where(\%where);

互いのplaceholderの形式を揃えられなかったので*1乱暴に名前形式に変換する。

$where =~ s/\A\s*where\b\s*//i;
my $paramIndex = 1;
$where =~ s/\?/
	my $paramName = 'anon_' . $paramIndex++;
	$params{$paramName} = shift(@whereParams);
	":$paramName";
/eg;

後はselect()などにwhere => $where, param => \%paramsを渡すだけだ。

*1:より適したモジュールがあるかもしれない。