ビギナーだから使いたいO/Rマッパー   ~Tengを使った開発~    Hirobanex(Akabane Hiroyuki)   2012-06-29@Perl Beginners #3
コンテンツ• Tengを使いたい3つの理由• ビギナーにオススメのTengの導入方法• 本来のO/Rマッパーの効用                        1
Tengを使いたい3つの理由• DBIはよくわからん• O/Rマッパーだと開発が抜群に早くなる• コード量が少ないし、勉強になる                        2
生DBIはよくわからん• コンストラクション時の設定って?• セレクト系メソッドどれ使えばいい?• ドキュメントが長すぎてどこ読めば?• トランザクションって?• 突然、コネクション切れる?                      3
セレクト系メソッドどれ使えばいい?        refとかarrayとかhashとか、頭がパンクします・・・•fetchrow_arrayref     •selectrow_array•fetchrow_array        •sele...
O/Rマッパーだと開発が抜群に早くなる                   複数データ群をリレーションつけて登録する場合のコード比較                                            DBI         ...
コード量が少ないし、勉強になる• オーサーは日本人のnekokakさん• 不明点は誰かに聞けばわかりそう• 日本語情報豊富• 挙動確認がコード量が少ないため楽• コードをおうと、Perlの勉強になる                       6
ビギナーにオススメのTengの導入方法     DBIもよくわからんけど、とにかく早く使ってみたい人向け• Tengのnew(オブジェクトの作り方)• SELECT• INSERT、UPDATE、DELETE• トランザクション        ...
Tengのnew(オブジェクトの作り方)                                Teng::Schema::Loaderというのを使うと楽#Teng-0.14_05                   とりあえずメソッド...
SELECT                 SQL文の書けるsearch_by_sqlメソッドを使う                  複数行の取り出し                                    1行だけの取り出し...
INSERT、UPDATE、DELETE                      SQL文の書けるdoメソッドを使う                     INSERT                                UPDA...
トランザクション                              囲うだけuse MyDB;my $teng = MyDB->teng;my $txn = $teng->txn_scope;     for my $user_name...
実際のO/Rマッパーの効用       Tengを使いこなしてやれることを広げるためのキーワード          やれること                           Teng実装トランザクションをシンプルに書ける       DB...
その他Tengリファレンス                               cpanm Teng 0.14_05http://perl-users.jp/articles/advent-calendar/2011/teng/http...
最後に     YAPC::Asia2012のトークに応募しました!興味があったら、「いいね!」などお願いしますっ!                                  14
Upcoming SlideShare
Loading in...5
×

ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~

3,609

Published on

Perl Beginners#3で発表したSQL/DB初心者向けのPerlのO/RマッパーTengの使い方のチュートリアルです。

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,609
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
6
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~

  1. 1. ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~ Hirobanex(Akabane Hiroyuki) 2012-06-29@Perl Beginners #3
  2. 2. コンテンツ• Tengを使いたい3つの理由• ビギナーにオススメのTengの導入方法• 本来のO/Rマッパーの効用 1
  3. 3. Tengを使いたい3つの理由• DBIはよくわからん• O/Rマッパーだと開発が抜群に早くなる• コード量が少ないし、勉強になる 2
  4. 4. 生DBIはよくわからん• コンストラクション時の設定って?• セレクト系メソッドどれ使えばいい?• ドキュメントが長すぎてどこ読めば?• トランザクションって?• 突然、コネクション切れる? 3
  5. 5. セレクト系メソッドどれ使えばいい? refとかarrayとかhashとか、頭がパンクします・・・•fetchrow_arrayref •selectrow_array•fetchrow_array •selectrow_arrayref•fetchrow_hashref •selectrow_hashref•fetchall_arrayref •selectall_arrayref•fetchall_hashref •selectall_hashref •selectcol_arrayref 4
  6. 6. O/Rマッパーだと開発が抜群に早くなる 複数データ群をリレーションつけて登録する場合のコード比較 DBI Tenguse DBI; #Teng-0.14_05 use DBI;my @data_set = ( use Teng; [26,hiro], use Teng::Schema::Loader; [27,bane],); my @data_set = ( [26,hiro],my $dbh = DBI->connect("DBI:mysql:db_name;", "root", "pass",{ [27,bane], AutoCommit => 0, );}); my $dbh = DBI->connect("DBI:mysql:db_name;", "root", "pass",);for my $data (@data_set) { my ($age,$name) = @$data; my $teng = Teng::Schema::Loader->load( dbh => $dbh, my ($age_id) = $dbh->selectrow_array(q{ namespace => MyAPP::DB, SELECT id FROM age WHERE age = ? ); },undef,$age); $teng->load_plugin(FindOrCreate); unless ($age_id) { my $txn = $teng->txn_scope; my $sth = $dbh->prepare(q{ for my $data (@data_set) { INSERT INTO age (age) VALUES ( ? ) my ($age,$name) = @$data; }); $sth->execute($age); my $row = $teng->find_or_create(age,{ age => $age }); #mysql限定 $teng->insert(user, { age_id => $row->id, name => $name }); $age_id = $dbh->last_insert_id(undef, undef, age, id); } } $txn->commit; my $sth = $dbh->prepare(q{ INSERT INTO user (age_id, name) VALUES (?, ?) }); $sth->execute($age_id, $name);} 20行 7行$dbh->do(COMMIT); 5
  7. 7. コード量が少ないし、勉強になる• オーサーは日本人のnekokakさん• 不明点は誰かに聞けばわかりそう• 日本語情報豊富• 挙動確認がコード量が少ないため楽• コードをおうと、Perlの勉強になる 6
  8. 8. ビギナーにオススメのTengの導入方法 DBIもよくわからんけど、とにかく早く使ってみたい人向け• Tengのnew(オブジェクトの作り方)• SELECT• INSERT、UPDATE、DELETE• トランザクション 7
  9. 9. Tengのnew(オブジェクトの作り方) Teng::Schema::Loaderというのを使うと楽#Teng-0.14_05 とりあえずメソッド化 #Teng-0.14_05 永続化use strict; package MyDB;use warnings; use strict; use warnings; use utf8;use DBI; use DBI;use utf8; use Teng;use Teng; use Teng::Schema::Loader;use Teng::Schema::Loader; our $TENG;sub teng { sub teng { my $dbh = DBI->connect("dbi:SQLite:./users.db", , , +{ $TENG ||= do { Callbacks => { my $dbh = DBI->connect("dbi:SQLite:./users.db", , , +{ connected => sub { Callbacks => { my $conn = shift; connected => sub { $conn->do(<<EOF); #テーブルの構造をココに書く my $conn = shift;CREATE TABLE user ( $conn->do(<<EOF); id INTEGER PRIMARY KEY, CREATE TABLE user ( user_name varchar(10), id INTEGER PRIMARY KEY, sex varchar(10) default male, user_name varchar(10), age INTEGER default 20, sex varchar(10) default male,); age INTEGER default 20,EOF ); return; EOF }, return; }, }, sqlite_unicode => 1,#MySQLは、mysql_enable_utf8 => 1 , }, }); sqlite_unicode => 1, }); my $teng = Teng::Schema::Loader->load( dbh => $dbh, Teng::Schema::Loader->load( namespace => MyDB::Schema dbh => $dbh, ); namespace => MyDB::Schema} ); } } 1; 8
  10. 10. SELECT SQL文の書けるsearch_by_sqlメソッドを使う 複数行の取り出し 1行だけの取り出しuse MyDB; use MyDB;my @users = MyDB->teng->search_by_sql( my $row = MyDB->teng->search_by_sql( q{#SQL文が普通にかける q{ SELECT * FROM user WHERE user_name = ? }, SELECT [hirobanex] id, user_name )->first; FROM user WHERE sex = ? AND age > ? }, [male,20]#bind値は配列のリファレンスで設定)->all;#Rowオブジェクトなるものがいるfor my $row (@users) { #カラムはRowオブジェクトに #カラム名でメソッド呼び出し warn $row->id; warn $row->user_name;} 9
  11. 11. INSERT、UPDATE、DELETE SQL文の書けるdoメソッドを使う INSERT UPDATEuse MyDB; MyDB->teng->do(q{ UPDATE user SETMyDB->teng->do(q{ user_name = ? INSERT INTO user ( ,age = ? user_name,sex,age WHERE ) VALUES ( user_name = ? ?,?,? },undef,(bane,27,hirobanex)); );},undef,(hirobanex,male,26)); DELETE# errorハンドリングはTengのほうでやってくれている MyDB->teng->do(q{ DELETE user WHERE user_name = ? },undef,(bane)); 10
  12. 12. トランザクション 囲うだけuse MyDB;my $teng = MyDB->teng;my $txn = $teng->txn_scope; for my $user_name (hiro,bane,ytnobody) { $teng->do(q{ INSERT INTO user (user_name) VALUES (?); },umdef,$user_name ); }$txn->commit; hachioji.pm 11
  13. 13. 実際のO/Rマッパーの効用 Tengを使いこなしてやれることを広げるためのキーワード やれること Teng実装トランザクションをシンプルに書ける DBIx::TransactionManager突然コネクションが切られることはない $dbh->FETCH(Active), $dbh->pingの確認コンストラクション設定を楽にする ×リファレンスとかでかっこ良く条件文を書く SQL::Makerインサートしたと同時にその中身とったり、 Teng::Row(Rowオブジェクト)、便利メソッドつくる FindOrCreate, BulkInsertなど各種プラグインSQL文を発行するタイミングでなんかする inflate,deflate(triggerはない)SELECTのIN構文になげるバインド値に search_namedメソッド配列リファレンスを使いたい 12
  14. 14. その他Tengリファレンス cpanm Teng 0.14_05http://perl-users.jp/articles/advent-calendar/2011/teng/http://search.cpan.org/~nekokak/Teng-0.14_05/http://walf443.github.com/teng-doc/最後はソースコードも読もう 13
  15. 15. 最後に YAPC::Asia2012のトークに応募しました!興味があったら、「いいね!」などお願いしますっ! 14
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×