Perl暦およそ10年(?)の僕が
データベースを使えるように
     なるまでの昔話
    Perl Beginners #3
      Lightning Talk

       @ytnobody
およそ10年前。
Perlに触れて数ヶ月・・・
●   先輩「そろそろデータベースつかってみようかー」
●
    自分「なんですかそれ」
●   先輩「」
そもそも

データベース(=DB)とは

   何なのかを

  知らなかった
説明しよう!

    ここで言うデータベースとは、正しくは
「リレーショナルデータベースマネージメントシステム」
  と呼ばれ、RDBMSなどと略されるものである。

プログラム内で永続的にデータを保持するために
     用いられる仕組みであり、
 大抵はサーバソフトウェアとして提供される。

プログラムはデータベースと情報をやり取りするため
に、SQLと呼ばれる専用の命令文を発行する必要が
           ある。
初めての
DBを使ったプログラミング
●   自分「先輩~、できましたー><」
●
    先輩「どれどれみせてごらん・・・」
●   自分「これです!どうっすかね、動きますよ!ほら!」
●
    先輩「」
#!/usr/bin/perl
use DBI;
use DBD::mysql;
my $DBH = DBI->connect('DBI:mysql:dbname', 'user', 'password');
my $sth = $DBH->prepare('SELECT * FROM member WHERE area=12');
$sth->execute();
while (my @field = $sth->fetchrow_array()) {
    my $id = $field[0];
    my $name = $field[1];
    ...
    ......
    .........
}
先輩「ダメダメだね」
#!/usr/bin/perl
use DBI;
use DBD::mysql;
my $DBH = DBI->connect('DBI:mysql:dbname', 'user', 'password');
                                                        先輩:
                                                 use strict してないでしょ?
my $sth = $DBH->prepare('SELECT * FROM member WHERE area=12');
                                                        よくないなー
$sth->execute();
while (my @field = $sth->fetchrow_array()) {
    my $id = $field[0];
    my $name = $field[1];
    ...
    ......
    .........
}
#!/usr/bin/perl
use DBI;
use DBD::mysql;
my $DBH = DBI->connect('DBI:mysql:dbname', 'user', 'password');
                                                 先輩:
my $sth = $DBH->prepare('SELECT * FROM member WHERE area=12');
                                                 これはuseしなくてOK
$sth->execute();
while (my @field = $sth->fetchrow_array()) {
    my $id = $field[0];
    my $name = $field[1];
    ...
    ......
    .........
}
#!/usr/bin/perl
use DBI;
use DBD::mysql;
my $DBH = DBI->connect('DBI:mysql:dbname', 'user', 'password');
my $sth = $DBH->prepare('SELECT * FROM member WHERE area=12');
$sth->execute();
while (my @field = $sth->fetchrow_array()) {
    my $id = $field[0];
                                               先輩:
                                               $DBHを返す関数を作れば、
    my $name = $field[1];                      毎回connectを書く必要がないよね?
    ...
    ......
    .........
}
#!/usr/bin/perl
use DBI;
use DBD::mysql;
my $DBH = DBI->connect('DBI:mysql:dbname', 'user', 'password');
my $sth = $DBH->prepare('SELECT * FROM member WHERE area=12');
$sth->execute();
while (my @field = $sth->fetchrow_array()) {
    my $id = $field[0];
    my $name = $field[1];
    ...
                                先輩:
    ......
                                こりゃひどいなー。バインド変数使おうよ。
    .........
}
自分「え?バインド変数って何すか???」
#!/usr/bin/perl
use DBI;
use DBD::mysql;
my $DBH = DBI->connect('DBI:mysql:dbname', 'user', 'password');
my $sth = $DBH->prepare('SELECT * FROM member WHERE area=?');
$sth->execute(12);
while (my @field = $sth->fetchrow_array()) {
    my $id = $field[0];
    my $name = $field[1];
    ...                           先輩:
                                  バインド変数ってのは、これ「?」のことだね
    ......
    .........
}
#!/usr/bin/perl
use DBI;
use DBD::mysql;
my $DBH = DBI->connect('DBI:mysql:dbname', 'user', 'password');
my $sth = $DBH->prepare('SELECT * FROM member WHERE area=?');
$sth->execute(12);
while (my @field = $sth->fetchrow_array()) {
    my $id = $field[0];
    my $name = $field[1];
    ...                          先輩:
                                 で、executeするときに該当する値を渡すんだよ
    ......
    .........
}
ほえー・・・わかったようなわからんような・・・
あれから
1年の月日が経過。



     PHPつかってました!

       てへぺろっ☆
さらに月日は流れ、
2年経ったある日のこと。
●   上司「久々にPerlの案件だぞー」
●
    自分「ひさしぶりっすね。」
●   上司「MySQL使うぜ。あ、今回はお前に開発任せるから。」
●
    自分「え?!」
●   上司「もう大分なれてきたし、やれるだろ?」
●
    自分「はあ、まあ」
●   上司「おーそうだ、今回開発期間短いぞ。3週間しかねえw」
●
    自分「」
自分「どうにかして楽しないと、やばすぎる」
どうやって楽しようか・・・
●   上司「CPANってのがあるからさ、そこからなんか探せばいいんじゃ
    ないのか?」
●   自分「く、CPAN????」
説明しよう!

CPAN(しーぱん/くぱん??)とは、Perl向けに作られた
モジュール(出来合いの使いまわし可能なパーツ)の
           配布サイトだ。

      Perlを使って開発するのなら、
 便利なパーツがタダで手に入る、お得でクールな
     CPANを使わない手は無いぞ!
CPANに頼ってみよう!
●   自分「自力でコードを書く量が減るってことですか!?」
●
    上司「たぶんそういうことじゃないかなー」
●   自分「先輩に、いいパーツ知らないかきいてきます!」
●
    先輩「おれしらないよ」
●   自分「」
自分「もしかして、社内にCPANを
使いこなせてる人がいない??」
協力会社の開発スタッフに
きいてみた
●   協力「Class::DBIというモジュールを使うと楽だって聞きますけどね」
●
    自分「ドキュメント読んでみます」
自分「え、英語・・・?!」
英語の壁を乗り越えるが・・・
●   自分「英語だけど、高卒英語レベルでも割と理解できる・・・」
●
    自分「でもしかしこれ、使うの難しいな。」
●   自分「わざわざスキーマ用意するのが面倒だし・・・」
●   自分「ほかにもDBを操作するモジュールは無いものか・・・」
自分「こ、こ、これじゃー!!!!」
人生初のORマッパー(?)
それはDBIx::Simple

my $dbh = DBI->connect(...);
my $sql = 'SELECT * FROM user WHERE id=?';
my $sth = $dbh->prepare($sql);
$sth->execute(123);
my @col = $sth->fetchrow_array;
...
......
.........




                                             my $db = DBIx::Simple->new(...);
                                             $user = $db->select('user','*',{id => 1});
                                             ...
                  これがこうなった                   ......
                                             .........
自分「これはすげー!!!!」
その後のORマッパー
使用遍歴
●   Data::Model
    ●   キャッシュを意識せず、透過的に扱いたかった
●   Teng
    ●   最近はORマッパーといえばほぼこれ。
●   DBIx::Sunny
    ●   素のDBIにほんの少し手が加えられている。
       selectとかの便利メソッドが追加
        –
●   自作のORマッパー
    ●   作ってみたかっただけ
        –   スキーマ不要
        –   トランザクションをDSLっぽく書きたい
        –   いくつかの制約(主キーが”id”固定とか)
でも結局・・・
●   基本はDBI。
    ●   いまでもDBIだけで仕上げることがあるくらい。
    ●   Hachioji.pmの有志が開発しているwebチャット
        「Yancha」も今のところDBIでDBアクセス
●
    なんで?
    ●   シンプルisベスト
    ●   基本に忠実=基本さえわかっていれば、読める理解で
        きる
これからDBを使ったプログラムを
習得するなら
●   まずはDBI+MySQLの組み合わせでやってみよう
●   ORマッパーは「わかってる人間が楽をするためのもの」
    ●   最初からORマッパーを使うのは避けたほうが無難かも
●
    使うなら「利用人口の多いもの」を選ぶと楽
    ●
        周りに訊けます
        –   ツイッターとかで訊けばそれなりの回答があるかもしれない
        –   回答がつかなくても泣かない
            ●
                これ大事。
●   なれてきたら、データキャッシュ(memcached)の導入も視野に入れ
    てみる。
    ●
        負荷軽減、処理時間削減など、パフォーマンスに貢献
質問タイム
ありがとうございました。

Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話