ビギナーだから使いたいO/Rマッパー
~Tengを使った開発~
Hirobanex(Akabane Hiroyuki)
2012-06-29@Perl Beginners #3
1
コンテンツ
• Tengを使いたい3つの理由
• ビギナーにオススメのTengの導入方法
• 本来のO/Rマッパーの効用
2
Tengを使いたい3つの理由
• DBIはよくわからん
• O/Rマッパーだと開発が抜群に早くなる
• コード量が少ないし、勉強になる
3
生DBIはよくわからん
• コンストラクション時の設定って?
• セレクト系メソッドどれ使えばいい?
• ドキュメントが長すぎてどこ読めば?
• トランザクションって?
• 突然、コネクション切れる?
4
セレクト系メソッドどれ使えばいい?
•fetchrow_arrayref
•fetchrow_array
•fetchrow_hashref
•fetchall_arrayref
•fetchall_hashref
•selectrow_array
•selectrow_arrayref
•selectrow_hashref
•selectall_arrayref
•selectall_hashref
•selectcol_arrayref
refとかarrayとかhashとか、頭がパンクします・・・
5
O/Rマッパーだと開発が抜群に早くなる
use DBI; my @data_set = ( [26,'hiro'], [27,'bane'], );my $dbh = DBI->connect("DBI:mysql:db_name;", "root", "pass",{ AutoCommit => 0,
});
for my $data (@data_set) { my ($age,$name) = @$data;
my ($age_id) = $dbh->selectrow_array(q{ SELECT id FROM age WHERE age = ? },undef,$age);
unless ($age_id) {
my $sth = $dbh->prepare(q{
INSERT INTO age (age) VALUES ( ? ) });
$sth->execute($age); #mysql限定
$age_id = $dbh->last_insert_id(undef, undef, 'age', 'id'); }
my $sth = $dbh->prepare(q{
INSERT INTO user (age_id, name) VALUES (?, ?) }); $sth->execute($age_id, $name); } $dbh->do('COMMIT'); #Teng-0.14_05 use DBI; use Teng; use Teng::Schema::Loader; my @data_set = ( [26,'hiro'], [27,'bane'], );
my $dbh = DBI->connect("DBI:mysql:db_name;", "root", "pass",); my $teng = Teng::Schema::Loader->load( dbh => $dbh, namespace => 'MyAPP::DB', ); $teng->load_plugin('FindOrCreate'); my $txn = $teng->txn_scope;
for my $data (@data_set) { my ($age,$name) = @$data;
my $row = $teng->find_or_create('age',{ age => $age }); $teng->insert('user', { age_id => $row->id, name => $name }); }
$txn->commit;
DBI
Teng
複数データ群をリレーションつけて登録する場合のコード比較
6
コード量が少ないし、勉強になる
• オーサーは日本人のnekokakさん
• 不明点は誰かに聞けばわかりそう
• 日本語情報豊富
• 挙動確認がコード量が少ないため楽
• コードをおうと、Perlの勉強になる
7
ビギナーにオススメのTengの導入方法
• Tengのnew(オブジェクトの作り方)
• SELECT
• INSERT、UPDATE、DELETE
• トランザクション
DBIもよくわからんけど、とにかく早く使ってみたい人向け
#Teng-0.14_05 package MyDB;
use strict; use warnings; use utf8; use DBI; use Teng; use Teng::Schema::Loader; our $TENG; sub teng { $TENG ||= do { my $dbh = DBI->connect("dbi:SQLite:./users.db", '', '', +{ Callbacks => { connected => sub { my $conn = shift; $conn->do(<<EOF); CREATE TABLE user (
id INTEGER PRIMARY KEY, user_name varchar(10),
sex varchar(10) default 'male', age INTEGER default 20, ); EOF return; }, }, sqlite_unicode => 1, }); Teng::Schema::Loader->load( dbh => $dbh, namespace => 'MyDB::Schema' ); } } 1;
8
Tengのnew(オブジェクトの作り方)
#Teng-0.14_05 use strict; use warnings; use DBI; use utf8; use Teng; use Teng::Schema::Loader; sub teng { my $dbh = DBI->connect("dbi:SQLite:./users.db", '', '', +{ Callbacks => { connected => sub { my $conn = shift; $conn->do(<<EOF); #テーブルの構造をココに書く CREATE TABLE user (id INTEGER PRIMARY KEY, user_name varchar(10),
sex varchar(10) default 'male', age INTEGER default 20, ); EOF return; }, }, sqlite_unicode => 1,#MySQLは、mysql_enable_utf8 => 1 , }); my $teng = Teng::Schema::Loader->load( dbh => $dbh, namespace => 'MyDB::Schema' ); }