トップ 差分 一覧 Farm ソース 検索 ヘルプ RSS ログイン

DBI

Perl

[Perl]
最終更新時間:2009年12月08日 04時55分52秒

DBI

MySQLからperlでデータを取り出すときの方法を書く。
サンプルとしてid, name, messageのデータを持ったテーブルを作成し、
サンプルプログラムからselectを行い、また行数を取得する。

 サンプルデータ

データベースからテーブルまで作成する

# mysql -u username -p
# ****
> create database sample; #データベース作成
> use sample
> create table smpl ( #テーブル作成
>   id int,
>   name varchar(20),
>   message text
> ) engine=innodb;
> insert into smpl values(1, "hoge", "hoge first");
> insert into smpl values(2, "fuga", "fuga first");
> insert into smpl values(3, "foo",  "foo first");
> exit

 perlスクリプト

sample.pl

#!/usr/bin/perl

use strict;
use warnings;
use DBI;

my ($dbh, $sth, $count);
$dbh = DBI->connect("DBI:mysql:host=localhost;database=sample",
                     "username", "****");
$sth = $dbh->prepare("select id, name, message from smpl");

$sth->execute();

$count = 0;
while (my @val = $sth->fetchrow_array()) {
  print "id = $val[0], name = $val[1], message = $val[2]\n";
  ++$count;
}
print "$count rows total\n";
$sth->finish();
$dbh->disconnect();
exit(0);

 解説

データベース接続

# $dbh = DBI->connect("DBI:mysql:database=データベース名", "ユーザ名,", "パスワード");

MySQLクエリ発行〜切断

# $sth = $dbh->prepare("MySQLクエリ");
# $sth->execute();
# $sth->finish();
# $sth->disconnect();

メソッド

 データ取り出しメソッド

MySQLからデータを取り出すためのメソッドを記述する。

メソッド 意味 or 使い方
prepare() ececute()後、fetchrowなどを使う
selectrow_array() 一つの行または列を取り出す
selectcol_arrayref() 列の値の配列リファレンスを返す
selectall_arrayref() 全ての値を行列で取り出し、そのリファレンスを返す
selectrow_arrayref() 行の値の配列リファレンスを返す
selectrow_hashref() 行の値のハッシュリファレンスを返す
selectall_hashref() 全ての値を行列で取り出し、そのリファレンスを返す。

 

データは先ほどのデータを使う。

prepare()

prepare.pl

 #!/usr/bin/perl
 
 use strict;
 use warnings;
 use DBI;
 
 my ($dbh, $sth);
 
 $dbh = DBI->connect("DBI:mysql:sample", "username", "****");
 $sth = $dbh->prepare("select id, name, message from smpl");
 
 $sth->execute();
 
 while (my $ref = $sth->fetchrow_hashref()) {
   print $ref->{id}, ":", $ref->{name}, ":", $ref->{message},"\n";
 }

結果

# perl prepare.pl
 1:hoge:hoge first
 2:fuga:fuga first
 3:foo:foo first

selectrow_array()

selectrow_array.pl

 #!/usr/bin/perl
 
 use strict;
 use warnings;
 use DBI;
 
 
 my ($dbh, @row);
 
 $dbh = DBI->connect("DBI:mysql:sample", "usename", "****");
 @row = $dbh->selectrow_array("select id, name, message from smpl");
 print "@row\n";

結果

# perl selectrow_array.pl
 1 hoge hoge first #配列が4つあるみたいでみにくいな。。

selectcol_arrayref()

slctcol_aryref.pl

 #!/usr/bin/perl
 
 use strict;
 use warnings;
 use DBI;
 use Data::Dumper;
 
 my ($dbh, $ref);
 
 $dbh = DBI->connect("DBI:mysql:sample", "usename", "****");
 
 $ref = $dbh->selectcol_arrayref("select name from smpl");
 
 print Dumper($ref);

結果
nameの列の値を全てとってこれる

# perl slctcol_aryref()
 $VAR1 = [
         'hoge',
         'fuga',
         'foo'
       ];

selectall_arrayref()

slctall_aryref.pl

 #!/usr/bin/perl
 
 use strict;
 use warnings;
 use DBI;
 use Data::Dumper;
 
 my ($dbh, $ref);
 $dbh = DBI->connect("DBI:mysql:sample", "kikuchi", "takomati");
 $ref = $dbh->selectall_arrayref("select id, name, message from smpl");
 print Dumper($ref);

結果
全ての値を行列としてとってこれる

# perl slctall_aryref.pl
 $VAR1 = [
           [
             '1',
             'hoge',
             'hoge first'
           ],
           [
             '2',
             'fuga',
             'fuga first'
           ],
           [
             '3',
             'foo',
             'foo first'
           ]
         ];

selectrow_hashref();

また今度

selectall_hashref();

slctall_hashref.pl

 #!/usr/bin/perl
 
 use strict;
 use warnings;
 use DBI;
 use Data::Dumper;
 
 my ($dbh, $ref);
 
 $dbh = DBI->connect("DBI:mysql:sample", "username", "****");
 
 $ref = $dbh->selectall_hashref("select * from smpl", 'id'); # 第2引数としてkeyを指定できる?
 
 print Dumper($ref);

結果
idをキーとしたハッシュリファレンスをとってこれる
※ この場合はidの値を一意にしないとデータが上書きされる。

# perl slctall_hashref.pl
 $VAR1 = {
           '1' => {
                    'name' => 'hoge',
                    'id' => '1',
                    'message' => 'hoge first'
                  },
           '3' => {
                    'name' => 'foo',
                    'id' => '3',
                    'message' => 'foo first'
                  },
           '2' => {
                    'name' => 'fuga',
                    'id' => '2',
                    'message' => 'fuga first'
                  }
         };

 DBIコマンド集

 
メソッド 解説
connect データベースと接続する
disconnect データベースとの接続を切る
prepare SQL文を設定する
execute 設定されたSQL文を実行する
do SQL文を設定し、実行する
quote 挿入するためのクォート文字、またはBLOB値
fetch フィールドの配列参照として次の行を取り出す。最速。
fetchrow_array フィールドの配列として次の行を取り出す。簡単。
fetchrow_hashref ハッシュテーブルへの参照として次の行を取り出す。便利。

参考:DBI