行のフェッチ

DBIx::Customで「行をフェッチ」する方法を解説します。

行をフェッチする

executeやselectメソッドの戻り値はDBIx::Custom::Resultオブジェクトです。DBIx::Custom::Resultクラスは行をフェッチするためのたくさんのメソッドがあります。

一行づつフェッチ(配列)

一行フェッチして、その行を配列のリファレンスとして取得するにはfetchメソッドを使用します。
# fetch a row and put it into array refrence
my $row = $result->fetch;

次のようなデータを取得できます。

['Perl', 'Ken']

一般的には次のようにwhile文と一緒に使います。フェッチできる行がなくなれば、undefが返ります。

# Fetch with while loop
while (my $row = $result->fetch) {
  my $title  = $row->[0];
  my $author = $row->[1];
}

一行だけフェッチ(配列)

一行だけフェッチして、その行を配列のリファレンスとして取得するにはfetch_oneメソッドを使用します。自動的にステートメントハンドルのfinishメソッドが呼び出されます。

# Fetch only a row and put it into array reference
my $row = $result->fetch_one;

次のようなデータを取得できます。

['Perl', 'Ken']

すべての行をフェッチ(配列)

すべての行をフェッチして、それを配列の配列のリファレンスとして取得するにはfetch_allメソッドを使用します。

# Fetch all rows and put them into array of array reference
my $rows = $result->fetch_all;

次のようなデータを取得できます。

[
  ['Perl', 'Ken'],
  ['Ruby', 'Mike']
]

一行づつフェッチ(ハッシュ)

一行フェッチして、その行をハッシュのリファレンスとして取得するにはfetch_hashメソッドを使用します。

# Fetch a row and put it into hash reference
my $row = $result->fetch_hash;

次のようなデータを取得できます。

{title => 'Perl', author => 'Ken'}

一般的には次のようにwhileループと一緒に使います。フェッチできる行がなくなれば、undefが返ります。

# Fetch with while loop
while (my $row = $result->fetch_hash) {
  my $title  = $row->{title};
  my $author = $row->{author};
}

1行だけフェッチ(ハッシュ)

一行だけフェッチして、その行を配列のリファレンスとして取得するにはfetch_hash_oneメソッドを使用します。自動的にステートメントハンドルのfinishメソッドが呼び出されます。

# Fetch only a row and put it into hash reference
my $row = $result->fetch_hash_one;

次のようなデータを取得できます。

{title => 'Perl', author => 'Ken'}

oneというメソッドはfetch_hash_oneメソッドの別名になっていて、こちらのほうが短く記述することができます。

# Alias of fetch_hash_one
my $row = $result->one;

すべての行をフェッチ(ハッシュ)

すべての行をフェッチして、それをハッシュの配列のリファレンスとして取得するにはfetch_hash_allメソッドを使用します。

# Fetch all rows and put them into array of hash reference
my $rows = $result->fetch_hash_all;

次のようなデータを取得します。

  [
    {title => 'Perl', author => 'Ken'},
    {title => 'Ruby', author => 'Mike'}
  ]

allというメソッドはfetch_hash_allメソッドの別名になっていて、こちらのほうが短く記述することができます。

# Alias of fetch_hash_all
my $rows = $result->all;

便利なフェッチ方法

DBIx::Custom::Resultクラスは他にも便利なフェッチするためのメソッドがあります。

value

ひとつの値を取得するのにvalueメソッドは便利です。最初の行の最初の値だけを取得できます。フェッチできなかった場合はundefを返します。

my $value = $result->value;

valueメソッドは、count関数などを使って、件数を取得したい場合に便利でしょう。

my $count = $dbi->select('count(*)')->value;

以下の記述とほぼ同じ意味になります。

my $count = $dbi->select('count(*)')->fetch_one->[0];

values

最初の列の複数の値を取得するのにvaluesメソッドは便利です。

my $values = $result->values;

たとえばMySQLの「show tables」文を実行してテーブル一覧を取得するときに利用できます。

my $tables = $dbi->select('show tables')->values;

これは以下の記述と同じ意味になります。

my $rows =  $dbi->select('show tables')->fetch_all;
my $tables = [map { $_->[0] } @$rows];

flat

flatメソッドは、取得した行の値をひとつの平坦なリストにします。

my @list = $result->flat;

たとえば以下のような処理を実行するとします。

my @list = $dbi->select(['id', 'title'])->flat;

そして以下のようなテーブルだったとします。

(ヘッダ) id    title 
         1     Perl
         2     Ruby

するとflatメソッドは以下のようなリストを返却します。

(1, 'Perl', 2, 'Ruby')

ハッシュに代入すればキーと値のペアを簡単に取得できます。

my %titles = $dbi->select(['id', 'title'])->flat;

kv

kvメソッドはキーと値のペアを取得するときに便利です。

my $key_value = $result->kv;
my $key_values = $result->kv(multi => 1);

たとえば、本のIDをキーとしてタイトルと著者の値としたハッシュのリファレンスを取得するには次のようにします。

my $books = $dbi->select(['id', 'title', 'author'])->kv;

これは以下のようなデータになります。

{
  1 => {title => 'Perl', author => 'Ken'},
  2 => {title => 'Ruby', author => 'Taro'}
}

kvs

一つのキーに対して複数の値を対応させたい場合はkvsメソッドを使用します。

my $books = $dbi->select(['author', 'title', 'price'])->kvs;

次のような値が返却されます。

{
  Ken => [
    {title => 'Perl', price => 1000},
    {title => 'Good', price => 2000}
  ],
  Taro => [
    {title => 'Ruby', price => 3000},
    {title => 'Sky', price => 4000}
  ]
}

関連情報