日向夏特殊応援部隊

俺様向けメモ

SQL::Interp

SQL::Interp を最近使ったりします。ってのも生 DBI だと IN 文とか placeholder 化するの面倒だし。

と言う訳で下記サンプル。__END__ 以下に結果もつけといた。

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dump qw(dump);
use Perl6::Say;
use SQL::Interp qw(sql_interp);

{
    my ($sql, @bind) = sql_interp 
        'INSERT INTO identifier', 
        +{ resource_id => 'xri://=zigorou', canonical_id => 'xri://=!545A.6972.43FA.38AD' };

    say dump($sql, \@bind);
}

{
    my ($sql, @bind) = sql_interp
        'UPDATE identifier SET',
        +{ canonical_id => 'abcdefg' },
        'WHERE',
        +{ resource_id => 'http://zigorou.myopenid.com/', status => 1 };

    say dump($sql, \@bind);
}

{
    my ($sql, @bind) = sql_interp
        'SELECT resource_id, canonical_id FROM identifier WHERE resource_id IN',
        [qw|xri://=zigorou http://zigorou.myopenid.com/ http://profile.livedoor.com/zigorou_|];

    say dump($sql, \@bind);
}

__END__

(
  "INSERT INTO identifier (canonical_id, resource_id) VALUES(?, ?)",
  ["xri://=!545A.6972.43FA.38AD", "xri://=zigorou"],
)
(
  "UPDATE identifier SET canonical_id=? WHERE (resource_id=? AND status=?)",
  ["abcdefg", "http://zigorou.myopenid.com/", 1],
)
(
  "SELECT resource_id, canonical_id FROM identifier WHERE resource_id IN (?, ?, ?)",
  [
    "xri://=zigorou",
    "http://zigorou.myopenid.com/",
    "http://profile.livedoor.com/zigorou_",
  ],
)

ちなみに作者は CGI::Application の人。らしいっちゃらしい。

SQL の組み立てって色んなアプローチあるけど、しっくり来るのは無いなぁ。SQL::Abstract みたいなアプローチも良いとは思うけど、SQL の原型が生々しい方が使いやすいなんて事も環境*1によってはあるのかなぁと。

SQL::Interp がベターとも思わないけど。

詳しくは perldoc SQL::Interp して下さい。

*1:システム的にも人的にも