DBIの使い方
いつまで経ってもDBIの使い方が覚えられない..(特にselectall_arrrayrefとか)。この機にちゃんとアタマを整理して身につけちゃいたい。
例によってMySQLのサンプルデータ使ってやってみる。まずは準備から。
#!/usr/bin/perl use strict; use warnings; use DBI; use Data::Dumper; my $dbh = DBI->connect( 'dbi:mysql:world', 'mysql', undef, +{RaiseError=>1} ); my $stmt = q{ select ID, Name, CountryCode, District, Population from City limit 3 };
selectall_arrayref
まずはこれを試してみます。
print Dumper $dbh->selectall_arrayref($stmt, +{Slice => []}); $VAR1 = [ [ '1', 'Kabul', 'AFG', 'Kabol', '1780000' ], [ '2', 'Qandahar', 'AFG', 'Qandahar', '237500' ], [ '3', 'Herat', 'AFG', 'Herat', '186800' ] ];
Sliceに[]を指定すると全部の値を取得ですね。
print Dumper $dbh->selectall_arrayref($stmt, +{Slice => [qw/1 2/]}); $VAR1 = [ [ 'Kabul', 'AFG' ], [ 'Qandahar', 'AFG' ], [ 'Herat', 'AFG' ] ];
Slice => [qw/1 2/]とすると、NameとCountryCodeが取得できました。カラムのindex値ですね。
print Dumper $dbh->selectall_arrayref($stmt, +{Columns => [qw/2 3/]}); # Name, CountryCode $VAR1 = [ [ 'Kabul', 'AFG' ], [ 'Qandahar', 'AFG' ], [ 'Herat', 'AFG' ] ];
Columns => qw/2 3/とすると同じ値になりました。SliceとColumnsはカラムの基点の違いですね。
今度はSliceに配列リファレンスではなく、ハッシュリファレンスを渡してみます。
print Dumper $dbh->selectall_arrayref($stmt, +{Slice => {}}); $VAR1 = [ { 'ID' => '1', 'District' => 'Kabol', 'Name' => 'Kabul', 'Population' => '1780000', 'CountryCode' => 'AFG' }, { 'ID' => '2', 'District' => 'Qandahar', 'Name' => 'Qandahar', 'Population' => '237500', 'CountryCode' => 'AFG' }, { 'ID' => '3', 'District' => 'Herat', 'Name' => 'Herat', 'Population' => '186800', 'CountryCode' => 'AFG' } ];
一目瞭然、ハッシュリファレンスの配列リファレンス。
ではハッシュのkeyを指定してみるとどうなるか?
print Dumper $dbh->selectall_arrayref($stmt, +{Slice => {Name=>1}}); $VAR1 = [ { 'Name' => 'Kabul' }, { 'Name' => 'Qandahar' }, { 'Name' => 'Herat' } ];
指定したkeyのみのハッシュリファレンスになりました。
selectall_hashref
続いてはハッシュリファレンスで返す、selectall_hashref
print Dumper $dbh->selectall_hashref($stmt, 'ID'); # ALL $VAR1 = { '1' => { 'ID' => '1', 'District' => 'Kabol', 'Name' => 'Kabul', 'Population' => '1780000', 'CountryCode' => 'AFG' }, '3' => { 'ID' => '3', 'District' => 'Herat', 'Name' => 'Herat', 'Population' => '186800', 'CountryCode' => 'AFG' }, '2' => { 'ID' => '2', 'District' => 'Qandahar', 'Name' => 'Qandahar', 'Population' => '237500', 'CountryCode' => 'AFG' } };
第二引数に指定したカラム名(ここではID)をkeyに持つハッシュリファレンスができました。valueはさらにハッシュリファレンスになっています。
これで一通りselectall_arrayref, selectall_hashrefを試せたはず。使い方はバッチリアタマにイメージできた。
最後に。
$dbh->disconnect;
は忘れずに。