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;

は忘れずに。