日向夏特殊応援部隊

俺様向けメモ

生 DBI ユーザーのための DBI Cookbook (6)

さて、今日は selectcol_arrayref です。昨日、会社のグルメな同僚に教えて貰いました。

ちょうど 生 DBI ユーザーのための DBI Cookbook (1) - Yet Another Hackadelic にて selectall_arrayref + Slice, selectall_hashref などの使い方を書きましたが、こちらもかなり便利。

CREATE TABLE `application` (
  `id` int(10) unsigned NOT NULL,
  `title` varchar(32) CHARACTER SET sjis NOT NULL,
  `created_on` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_on` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO application(id, title, created_on, updated_on) VALUES(1, 'AKB48', NOW(), NOW()), (2, 'tomochin dokidoki panic', NOW(), NOW()), (3, 'Tactics Ogre', NOW(), NOW()), (4, 'hidek kanreki', NOW(), NOW());

みたいな感じで適当にレコードを入れておきます。

selectcol_arrayref で id 一覧を取得

まずはサンプルを。

#!/usr/bin/perl

use strict;
use warnings;

use DBI;
use Data::Dump qw(dump);

my $dbh = DBI->connect('dbi:mysql:dbname=test', 'root', '', +{ RaiseError => 1 });
my $app_ids = $dbh->selectcol_arrayref( 'SELECT id FROM application' );
warn dump($app_ids);

これは次のようになります。

[1, 2, 3, 4]

指定したカラムの配列リファレンスとして取得出来るのが selectcol_arrayref なんですな。便利です。

Columns attribute でさらに自在にデータ整形

Columns と言う attribute を指定すると、指定したインデックス(1から始まります)のカラムを平坦にした配列リファレンスを取得する事が出来ます。

#!/usr/bin/perl

use strict;
use warnings;

use DBI;
use Data::Dump qw(dump);

my $dbh = DBI->connect('dbi:mysql:dbname=test', 'root', '', +{ RaiseError => 1 });
my %app_title_map = @{$dbh->selectcol_arrayref( 'SELECT id, title FROM application', +{ Columns => [ 1, 2 ] } )};

warn dump(\%app_title_map);

これは、

{
  1 => "AKB48",
  2 => "tomochin dokidoki panic",
  3 => "Tactics Ogre",
  4 => "hidek kanreki",
} 

のようになります。つまり、selectcol_arrayref($stmt, +{ Columns => [1, 2] }); は、

[ 
  "1レコード目のid", "1レコード目のtitle",
  "2レコード目のid", "2レコード目のtitle",
  "3レコード目のid", "3レコード目のtitle",
  "4レコード目のid", "4レコード目のtitle",
  "5レコード目のid", "5レコード目のtitle"
 ]

みたいに取得出来る訳ですね。

ここで出したサンプルはドキュメントに思いっきり書いてありますw ドキュメント嫁って話ですな。