と                           で
DBIx::ClassとDBIx::Class::Schema::Loaderで
楽々O/Rマッピング
        マッピング
WEB技術勉強会 第25回
   技術勉強会    回
RYUICHI TANAKA.
O/Rマッピングとは

オブジェクトとRDBのレコード
を対応付けることができる技術。
SQLを書かなくともDBアクセス
ができる。
代表的ORマッパー
Perl
 DBIx::Class(通称DBIC)
 Class::DBIx(現在は開発停止)
Java
 Hibernate(JPA標準)
Ruby(Rails)
 ActiveRecord
PHP
 Propel( synfonyで使用)
ORマッピングのなにがよいのか

SQLを書かなくて済む
コードがすっきりする
DB構成が変わったときの保守
が比較的楽
逆にORマッピングのだめなところ

処理が遅くなる
複雑なSQLは厳しい
つまり、ORマッピングとは

簡単なSQLですむときに使うと
幸せになれる
それ以外のときは生SQLを実行
しないと幸せになれない
DBIx::Class

 Perlで一番メジャーなORマッ
 パー
 Class::DBIの後継的存在
 Catalystで標準使用されている
DBIx::Class::Schema::Loader

 DBIx::Classで使用するSchema
 ファイルを自動生成する
Schemaファイルとは

 テーブルの各カラムのデータ型
 をオブジェクトとして定義する
 DBIx::Classを継承して定義する
インストール

CPAN経由で
依存モジュールがすごい数イン
ストールされる
Schemaファイルの生成

 ワンライナーの場合
$ perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib -
e 'make_schema_at "Hoge::Schema", {relationships => 1, debug => 1},
["dbi:mysql:hoge","user","password"]'




ただし、今回はワンライナーは使用しない。
ソースファイルにして拡張性を高めて、
Eclipseから実行するため。
Schemaファイルの生成




                ② スキーマファイルが
                   自動生成される


                ① make_schema.pl
                  を実行する
Schemaファイルの生成(コード)
#!/usr/bin/perl
use strict;
use warnings;
use FindBin::libs qw{ export base=syscommon };
use MyLibs::Common::DB::Config;
use DBIx::Class::Schema::Loader qw( make_schema_at );

# スキーマファイルの出力先
my $dump_directory = 'C:/workspace/syscommon';

# データベース名を指定
my $dbname = "tclipers";

my ($conf_obj, $db_conf);

$conf_obj = MyLibs::Common::DB::Config->new();
$conf_obj->use_db("mysql");
$db_conf = $conf_obj->get_db_config();

make_schema_at(
   'MyLibs::Common::DB::Schema',
   {relationships => 1, debug => 1, dump_directory => $dump_directory},
   ["dbi:$db_conf->{dbms}:dbname=$dbname;host=$db_conf->{host}", $db_conf->{user}, $db_conf->{pass}]
);
生成されたSchemaファイル
package MyLibs::Common::DB::Schema::Tclipers;

use strict;
use warnings;

use base 'DBIx::Class';

__PACKAGE__->load_components("Core");
__PACKAGE__->table("tclipers");
__PACKAGE__->add_columns(
 "id",
 { data_type => "INT", default_value => undef, is_nullable => 0, size => 11 },
 …
);
__PACKAGE__->set_primary_key("id");
__PACKAGE__->add_unique_constraint("url_hash_index", ["url_hash"]);


# Created by DBIx::Class::Schema::Loader v0.04006 @ 2009-07-12 01:49:00
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:YCPFZVg0EvGhZEbLwsh2AA


# You can replace this text with custom content, and it will be preserved on regeneration
1;
実際にORマッピングしてみる

Schemaファイル生成時に同時
に作られる「Schema.pm」を
useする
Schema.pmは実行するプログラ
ムから見えるようにSchema
ファイルを生成する必要がある
実行ファイルからSchema.pmが
            離れた位置にある場合は、
Schema.pm
            「FindBin::libs」
            を使って読ませる。

            このやり方は、自作モジュール
            を一括管理するとき便利。


実行ファイル
ORマッピングする前
use TrushCliper::DB;

(中略)

my ($sql, @bind);
my $db = TrushCliper::DB->new();
$db->DBConnect();

$sql = “INSERT INTO tclipers (title, url, comment, date) ”;
$sql.= “VALUES (?,?,?,?)”;
@bind = ($title, $url, $comment, $date);

$db->register($sql, @bind);

$db->Close();
ORマッピングした後
use MyLibs::Common::DB::Config;
use MyLibs::Common::DB::Schema;

(中略)                                                              データベース接続

my $connect_info = ["dbi:$db_conf->{dbms}:dbname=$dbname;host=$db_conf->{host}",
           $db_conf->{user}, $db_conf->{pass}];
my $schema = MyLibs::Common::DB::Schema->connect(@{$connect_info});
$schema->storage->dbh->do("SET names utf8");

my $result = $schema->resultset($schema_name)->find_or_new({
    title => $title,
    url => $url,
    url_hash => $url_hash,
    comment => $comment,
                                                       Insert文と同様
    date => $date
});

unless ($result->in_storage) {
  $result->insert;
}
ORマッピングしてみて

コードはきれいになる
単純なSQLですむときはORMでいいと
思った
学習コストがかかる。ORマッパーごとに
微妙に使い方が違う。
結局工数は大して変わらない気がする
コードをきれいにするだけならストアド
プロシージャでもいい気はする
結論

      時と場所を選べ!
時:単純なSQLな時は使える。複雑な時は使えな
い。
場所:大学なら使い放題。会社はPJ次第…。


技術の理解やリファクタリングなどの目的
では使えるので皆さん使ってみてはどうでしょう?

More Related Content

PDF
Web技術勉強会 20100925
PDF
Yapc -asia 2012 lt @studio3104
PDF
もにかじ2 lt @studio3104
PDF
Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話
PPT
Customization of DBIC::Schema::Loader
PDF
Haskellday rf
PDF
Chiba.pm #1 lt @studio3104
PDF
PDOでデータベース接続と SQLインジェクション対策
Web技術勉強会 20100925
Yapc -asia 2012 lt @studio3104
もにかじ2 lt @studio3104
Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話
Customization of DBIC::Schema::Loader
Haskellday rf
Chiba.pm #1 lt @studio3104
PDOでデータベース接続と SQLインジェクション対策

What's hot (19)

PDF
知って得する標準関数の使い方
PDF
大ざっぱにオブジェクト指向
PPTX
サーバを作ってみた (2)
PDF
WordPress on Auzre Websites
PDF
LexADV_TryDDM Ver. 0.1bの概要
KEY
PPTX
Silkについて
PPT
Erlang Web
PDF
Rails Controller Fundamentals
PPTX
クローラを作る技術と設計 (毎週のハンズオン勉強会資料)
PPTX
Ruby メタプログラミングによるXMLテンプレートエンジンの実装と評価
 
PDF
HaskellDB
PPTX
Zend Db Table拡張説明資料
PDF
Ruby 同好会宣言
PDF
2 TomcatによるWebアプリケーションサーバ構築 第4章 Tomcatの構成(3)-データソース
KEY
Perlで伝統芸能
ODP
Nambapm_napthats
PDF
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
PDF
Dartをはじめよう
知って得する標準関数の使い方
大ざっぱにオブジェクト指向
サーバを作ってみた (2)
WordPress on Auzre Websites
LexADV_TryDDM Ver. 0.1bの概要
Silkについて
Erlang Web
Rails Controller Fundamentals
クローラを作る技術と設計 (毎週のハンズオン勉強会資料)
Ruby メタプログラミングによるXMLテンプレートエンジンの実装と評価
 
HaskellDB
Zend Db Table拡張説明資料
Ruby 同好会宣言
2 TomcatによるWebアプリケーションサーバ構築 第4章 Tomcatの構成(3)-データソース
Perlで伝統芸能
Nambapm_napthats
【アシアル塾】PHPオブジェクト指向再入門・第一回クラスとオブジェクト
Dartをはじめよう
Ad

Viewers also liked (8)

PDF
Web技術勉強会 20110514
PDF
Web技術勉強会 第26回
PDF
Web技術勉強会 第29回
PDF
Web技術勉強会9回目(Slideshare用)
PDF
Web技術勉強会10回目(Slideshare用)
PDF
Web技術勉強会12回目
PDF
Web技術勉強会6回目
PDF
Web技術勉強会 20100424
Web技術勉強会 20110514
Web技術勉強会 第26回
Web技術勉強会 第29回
Web技術勉強会9回目(Slideshare用)
Web技術勉強会10回目(Slideshare用)
Web技術勉強会12回目
Web技術勉強会6回目
Web技術勉強会 20100424
Ad

Similar to Web技術勉強会 第25回 (20)

PDF
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
PDF
Ruby で扱う LDAP のススメ
PDF
PerlとSQLのいろいろ
PDF
WDD2012_SC-004
PDF
Rails初心者レッスン lesson1 3rd edition
ODP
Mongo db勉強会
KEY
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
PDF
RDBでのツリー表現入門
PDF
Database sql
PDF
PHP開発者のためのNoSQL入門
PDF
20110820 metaprogramming
PDF
Rails3.1rc4を試してみた
PPTX
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
PDF
Groovyで楽にSQLを実行してみよう
PDF
Db2 Warehouse Spark利用ガイド データ操作編
PDF
第2回品川Redmine勉強会(日本語全文検索)
PDF
MySQLを割と一人で300台管理する技術
PDF
OSC2012 OSC.DB Hadoop
PPTX
若気の至りを精算する
ビギナーだから使いたいO/Rマッパー ~Tengを使った開発~
Ruby で扱う LDAP のススメ
PerlとSQLのいろいろ
WDD2012_SC-004
Rails初心者レッスン lesson1 3rd edition
Mongo db勉強会
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
RDBでのツリー表現入門
Database sql
PHP開発者のためのNoSQL入門
20110820 metaprogramming
Rails3.1rc4を試してみた
SecurityとValidationの奇妙な関係、あるいはDrupalはなぜValidationをしたがらないのか
Groovyで楽にSQLを実行してみよう
Db2 Warehouse Spark利用ガイド データ操作編
第2回品川Redmine勉強会(日本語全文検索)
MySQLを割と一人で300台管理する技術
OSC2012 OSC.DB Hadoop
若気の至りを精算する

More from 龍一 田中 (20)

PDF
WebSocketでリアルタイム処理をする
PDF
Web技術勉強会 20130525 - Google Cloud Messaging入門
PDF
Web技術勉強会 20120728
PDF
Web技術勉強会 20120609
PDF
Web技術勉強会 20120114 - JenkinsでJava/PHP/Ruby/JavaScriptをビルドする
PDF
Web技術勉強会 20111112
PDF
Web技術勉強会 20110723
PDF
Web技術勉強会 20110611
PDF
Web技術勉強会 20110528
PDF
Web技術勉強会 第38回
PDF
Web技術勉強会 第37回
PDF
Web技術勉強会 第34回
PDF
Web技術勉強会 第33回
PDF
Web技術勉強会 第31回
PDF
Web技術勉強会 第30回
PDF
Web技術勉強会 第28回
PDF
Web技術勉強会23回目
PDF
Web技術勉強会 第19回
PDF
Web技術勉強会 第18回
PDF
Web技術勉強会11回目
WebSocketでリアルタイム処理をする
Web技術勉強会 20130525 - Google Cloud Messaging入門
Web技術勉強会 20120728
Web技術勉強会 20120609
Web技術勉強会 20120114 - JenkinsでJava/PHP/Ruby/JavaScriptをビルドする
Web技術勉強会 20111112
Web技術勉強会 20110723
Web技術勉強会 20110611
Web技術勉強会 20110528
Web技術勉強会 第38回
Web技術勉強会 第37回
Web技術勉強会 第34回
Web技術勉強会 第33回
Web技術勉強会 第31回
Web技術勉強会 第30回
Web技術勉強会 第28回
Web技術勉強会23回目
Web技術勉強会 第19回
Web技術勉強会 第18回
Web技術勉強会11回目

Web技術勉強会 第25回