ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 4,008 views

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

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

Statistics

Views

Total Views
4,008
Slideshare-icon Views on SlideShare
4,003
Embed Views
5

Actions

Likes
4
Downloads
5
Comments
0

3 Embeds 5

https://twitter.com 3
http://s.deeeki.com 1
http://www.google.co.jp 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • ビギナーだから使いたい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 •selectrow_arrayref•fetchrow_hashref •selectrow_hashref•fetchall_arrayref •selectall_arrayref•fetchall_hashref •selectall_hashref •selectcol_arrayref 4
    • 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
    • コード量が少ないし、勉強になる• オーサーは日本人のnekokakさん• 不明点は誰かに聞けばわかりそう• 日本語情報豊富• 挙動確認がコード量が少ないため楽• コードをおうと、Perlの勉強になる 6
    • ビギナーにオススメのTengの導入方法 DBIもよくわからんけど、とにかく早く使ってみたい人向け• Tengのnew(オブジェクトの作り方)• SELECT• INSERT、UPDATE、DELETE• トランザクション 7
    • 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
    • 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
    • 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
    • トランザクション 囲うだけ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
    • 実際の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
    • その他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
    • 最後に YAPC::Asia2012のトークに応募しました!興味があったら、「いいね!」などお願いしますっ! 14