名称
DBICx::Modeler::Generator - DBIx::Class::SchemaとDBICx::Modelerの動的な生成
概要
use Orochi;
my $container = Orochi->new;
$container->inject_literal('/Class/application' => 'MyApp');
$container->inject_literal('/Path/root' => 'examples');
# ...
$container->inject_class('DBICx::Modeler::Generator');
$container->inject_class('DBICx::Modeler::Generator::Class');
# ...
my $generator = $container->get('/DBICx/Modeler/Generator');
$generator->deploy_database;
$generator->update_schemata;
$generator->update_models;
# 備考: 上記のコードの代わりにDBICx::Modeler::Generator::CLIを使いましょう。
解説
エンタープライズアプリケーションでは、上手なアーキテクチャーを考慮する必要があります。 特に、モデリングはアプリケーションの保守性に多大な影響を及ぼします。
そこで、DBICx::Modelerを使ってスキーマとモデルのモジュールを分離することを推奨します。 この小気味よいモジュールは、DBIx::Classスキーマに対して、Mooseに基づいたレイヤーを提供します。
しかしながら、その分離による恩恵を享受するためには、たくさんのモデルモジュールを定義しなければなりません。 これはとても面倒な作業です。
そこで、以下の機能を提供するこのDBICx::Modeler::Generator
モジュールによって、面倒な共通的定義を自動化しましょう。
データベースの動的な配備
DBIx::Classスキーマモジュール群の動的な定義
DBICx::Modelerモデルモジュール群の動的な定義
なお、このDBICx::Modeler::Generator
モジュールは、DBIx::Class::Schema::Loadlerによるスキーマモジュール群の動的な生成を自動化する、単純なラッパーとしても使えます。
アプリケーションのモデリング方法 - 典型的な作業手順(ワークフロー)
MySQL Workbenchアプリケーション(http://www.mysql.com/products/workbench/)を使って、スキーマ群を定義します。
訳注: 日本語版ページはhttp://www-jp.mysql.com/products/workbench/にあります。ただし、このアプリケーションの日本語版が存在するわけではありません。
このアプリケーションは表(テーブル), 列(カラム), 索引(インデックス), 関係(リレーション)などを設計出来ます。
スキーマファイルの実例(サンプル)は、このディストリビューションのexamples/doc/DBDSC_schemata.mwbに同梱されています。 これはDBICx::Modelerのテスト用モジュール群を再現したもので、
artist
,cd
,track
というテーブル(スキーマ)を備えています。文書化のための任意の作業として、MySQL Workbenchを使ってER図(ERD: Entity-Relationship Diagram)を描画します。
ER図として出力した画像ファイルの実例(サンプル)は、このディストリビューションのexamples/doc/DBDERII_Including Information.pngに同梱されています。
MySQL Workbenchの
[Database] - [Forward Engineer...]
機能を使って、スキーマからデータベースを動的に配備します。もしくは、このモジュールのdeploy_database()メソッドで、MySQL Workbenchの
[File] - [Export] - [Forward Engineer SQL CREATE Script...]
機能によって生成したデータベース作成用スクリプト(データ定義言語, DDL: Data Definition Language)を使って配備します。生成したデータベース作成用スクリプトの実例(サンプル)は、このディストリビューションのexamples/src/myapp_mysql.sqlに同梱されています。
追加の定義が必要なスキーマモジュール群を静的に定義します(自分で書くということです)。 追加の定義とは、インフレーション(inflations: データベースから取り出す際にオブジェクト化する処理など), デフレーション(deflations: データベースへ格納する際にオブジェクトを文字列化する処理など), 関係(relationships)などです。
追加の定義のみを記述したスキーマモジュールファイルの実例は、このディストリビューションのexamples/src/lib/MyApp/Schema/Artist.pmに同梱されています。
このモジュールのupdate_schemata()メソッドを使って、スキーマモジュールファイル群を動的に生成します。
これによって、例えばこのディストリビューションのexamples/lib/MyApp/Schema/Artist.pmやexamples/lib/MyApp/Schema/Cd.pm等々にスキーマファイルを生成することが出来ます。
追加の定義が必要なモデルモジュール群を静的に定義します(自分で書くということです)。
追加の定義とは、Mooseのアトリビュート(attributes), メソッド(methods), メソッドモディファイヤー(method modifiers)などです。
追加の定義のみを記述したモデルモジュールファイルの実例は、このディストリビューションのexamples/src/lib/MyApp/Model/Cd.pmに同梱されています。
このモジュールのupdate_models()メソッドを使って、モデルモジュール群を動的に生成します。
これによって、例えばこのディストリビューションのexamples/lib/MyApp/Model/Artist.pmやexamples/lib/MyApp/Model/Cd.pm等々にモデルファイルを生成することが出来ます。
モデリングの秘訣
バッチスクリプトの使用
データベースの動的な配備, スキーマ群の動的な定義, モデル群の動的な定義を行うバッチスクリプトを使用することを推奨します。
バッチスクリプトファイルの実例(サンプル)は、このディストリビューションのexamples/src/sbin/maintain_models.plに同梱されています。 実行方法は見本節を参照してください。
出力した画像の寸法を揃える方法
MySQL Workbenchでは、ER図の1mmは出力されるPNG画像の5pxに相当します(これはWindows版のバージョン5.1.18 OSS時点での前提です)。
この情報に基づくと、PNG画像の寸法を指定することが出来ます。
例えば、Quad-VGA解像度(幅: 1280px, 高さ: 960px)として出力するために、以下のような設定を施してはいかがでしょうか:
[Paper]
グループ-
[Size]
リストボックスで[A4 (210 mm x 297 mm)]
アイテムを選択 [Orientation]
グループ-
[Landscape]
ラジオボタンをオンにする [Margins]
グループ-
[Top]
テキストボックスへ[10]
mmを入力[Left]
テキストボックスへ[10]
mmを入力[Bottom]
テキストボックスへ[35]
mmを入力[Right]
テキストボックスへ[12]
mmを入力
ご参考までに、サイズ検証スクリプトファイルの実例(サンプル)は、このディストリビューションのexamples/src/confirm_image_size.plとして同梱されています。
メソッド
コンストラクター
$di_container->get('/DBICx/Modeler/Generator')
依存性が注入されたオブジェクトを返します。
オブジェクトを取得するためには、DBICx::Modeler::Generator->new(...)
の代わりに上記の概要にあるコードを使ってください。
詳細は依存性の注入節を参照してください。
DBICx::Modeler::Generator::CLIによって依存性の注入を包み込んだインターフェースを使うことも出来ます。
DBICx::Modeler::Generator::CLI->new_with_options(%init_args)
DBICx::Modeler::Generator::CLIオブジェクトを返します。
ジェネレーターオブジェクトを取得するためには、このインターフェースを使うことを強く推奨します。MooseX::GetoptとMooseX::SimpleConfigを用いて依存性の注入作業を包み込むことが出来るためです。
以下の具体的なコードを参照してください:
my $generator = DBICx::Modeler::Generator::CLI->new_with_options(
application => 'MyApp',
root => '/path/to/root',
driver => 'SQLite',
)->generator;
機能
$self->deploy_database()
データベース作成用スクリプトに基づいてデータベースを配備します。
$self->update_models()
モデルモジュール群を更新します。
$self->update_schemata()
スキーマモジュール群を更新します。
依存性の注入
このクラスとそのサブクラスでは依存性の注入(DI: Dependency Injection)のためにMooseX::Orochiを使っています。
詳細はこのディストリビューションに同梱されているexamples/src/sbin/maintain_models.plを参照してください。
必須の依存
/DBICx/Modeler/Generator/Class
DBICx::Modeler::Generator::ClassLikeインターフェースを満たす実装クラスのインスタンスです。
このディストリビューションでは、一般的な用途に使える実装クラスとして、DBICx::Modeler::Generator::Driver::Classを同梱しています。
/DBICx/Modeler/Generator/Class/application
アプリケーションルートクラスのクラス名です。
/DBICx/Modeler/Generator/Driver
DBICx::Modeler::Generator::DriverLikeインターフェースを満たす実装クラスのインスタンスです。
このディストリビューションでは、一般的な用途に使える実装クラスとして、DBICx::Modeler::Generator::Driver::MySQLとDBICx::Modeler::Generator::Driver::SQLiteを同梱しています。
/DBICx/Modeler/Generator/Model
DBICx::Modeler::Generator::ModelLikeインターフェースを満たす実装クラスのインスタンスです。
このディストリビューションでは、一般的な用途に使える実装クラスとして、DBICx::Modeler::Generator::Driver::Modelを同梱しています。
/DBICx/Modeler/Generator/Path
DBICx::Modeler::Generator::PathLikeインターフェースを満たす実装クラスのインスタンスです。
このディストリビューションでは、一般的な用途に使える実装クラスとして、DBICx::Modeler::Generator::Driver::Pathを同梱しています。
/DBICx/Modeler/Generator/Path/root
アプリケーションルートディレクトリーのパスです。
- 型(Type)
-
Path::Class::Dir (MooseX::Types::Path::Classで型変換されます)
- 用例(Example)
-
/path/to/root
/DBICx/Modeler/Generator/Schema
DBICx::Modeler::Generator::SchemaLikeインターフェースを満たす実装クラスのインスタンスです。
このディストリビューションでは、一般的な用途に使える実装クラスとして、DBICx::Modeler::Generator::Driver::Schemaを同梱しています。
/DBICx/Modeler/Generator/Tree
DBICx::Modeler::Generator::TreeLikeインターフェースを満たす実装クラスのインスタンスです。
このディストリビューションでは、一般的な用途に使える実装クラスとして、DBICx::Modeler::Generator::Driver::Treeを同梱しています。
任意の依存
/DBICx/Modeler/Generator/Class/base_part
/DBICx/Modeler/Generator/Class/model_part
/DBICx/Modeler/Generator/Class/schema_part
/DBICx/Modeler/Generator/Driver/bin
- 型(Type)
-
Str
- 初期値(Default)
-
mysql
(ドライバーの実装クラスがDBICx::Modeler::Generator::Driver::MySQLの場合),sqlite3
(ドライバーの実装クラスがDBICx::Modeler::Generator::Driver::SQLiteの場合), 等
/DBICx/Modeler/Generator/Driver/database
- 型(Type)
-
Str
- 初期値(Default)
-
$application
,/$root/$application.$database_extension
, 等 - 用例(Example)
-
myapp
,my_app
, /path/to/root/my_app.db, 等
/DBICx/Modeler/Generator/Driver/dbd
- 型(Type)
-
Str
- 初期値(Default)
-
mysql
(ドライバーの実装クラスがDBICx::Modeler::Generator::Driver::MySQLの場合),SQLite
(ドライバーの実装クラスがDBICx::Modeler::Generator::Driver::SQLiteの場合), 等
/DBICx/Modeler/Generator/Driver/dsn
- 型(Type)
-
Str
- 初期値(Default)
-
dbi:$dbd:database=$database
,dbi:$dbd:database=$database;host=$host
,dbi:$dbd:database=$database;host=$host;port=$port
,dbi:$dbd:dbname=$database
, 等
/DBICx/Modeler/Generator/Driver/extension
- 型(Type)
-
Str
- 初期値(Default)
-
.dbl (ドライバーの実装クラスがDBICx::Modeler::Generator::Driver::SQLiteの場合), 等
/DBICx/Modeler/Generator/Driver/host
/DBICx/Modeler/Generator/Driver/password
/DBICx/Modeler/Generator/Driver/port
/DBICx/Modeler/Generator/Driver/username
/DBICx/Modeler/Generator/Path/creation_script
- 型(Type)
-
Path::Class::File (MooseX::Types::Path::Classで型変換されます)
- 初期値(Default)
-
/$root/$source/$application.$script_extension
- 用例(Example)
-
/path/to/root/src/myapp.sql
/DBICx/Modeler/Generator/Path/module_extension
/DBICx/Modeler/Generator/Path/script_extension
/DBICx/Modeler/Generator/Schema/components
- 型(Type)
-
ArrayRef[Str]
- 初期値(Default)
-
[]
(Don't use DBIx::Class::UTF8Columns, http://perl-users.jp/articles/advent-calendar/2009/hacker/04.htmlも参照)
/DBICx/Modeler/Generator/Schema/is_debug
/DBICx/Modeler/Generator/Tree/application
/DBICx/Modeler/Generator/Tree/library
/DBICx/Modeler/Generator/Tree/source
/DBICx/Modeler/Generator/Tree/target
見本
このディストリビューションでは、上記の作業手順(ワークフロー)に関する一切のファイルを、見本として同梱しています。
ディストリビューションのルートディレクトリーで、以下のコマンドを実行してください:
perl -Ilib examples/src/sbin/maintain_models.pl \\
-a MyApp -r examples -d SQLite
または
perl -Ilib examples/src/sbin/maintain_models.pl \\
-a MyApp -r examples -d MySQL -u username -w password \\
-l /Path/script_extension=_mysql.sql
または
perl -Ilib examples/src/sbin/maintain_models.pl \\
--configfile examples/src/myapp.yml
関連情報
MySQL Workbenchアプリケーションのホームページ, http://www.mysql.com/products/workbench/
訳注: 日本語版ページはhttp://www-jp.mysql.com/products/workbench/にあります。ただし、このアプリケーションの日本語版が存在するわけではありません。
Martin Fowler, Patterns of Enterprise Application Architecture, Toronto: Addison-Wesley Professional, 2002, 560p., ISBN 0321127420 / 978-0321127426
(PoEAA, PofEAAとして略されます)
訳注: 翻訳内容に対して色々な意見があるようですが、ともあれ日本語版が刊行されています。
マーチン=ファウラー(著), 長瀬 嘉秀(監訳), 株式会社テクノロジックアート(翻訳), 『(Object Oriented Selection) エンタープライズアプリケーションアーキテクチャパターン』, 東京: 翔泳社, 2005年, 548ページ, ISBN 4798105538 / 978-4798105536
エンタープライズアプリケーションに於いてスキーマとモデルを分離する方法, http://blog.eorzea.asia/2009/10/post_76.html
今後の予定
テストの拡充
テストでのTest::mysqldの使用 (参考: 牧 大輔さん(lestrratさん)による、http://mt.endeworks.jp/d-6/2009/10/things-ive-done-while-using-test-mysqld.htmlの記事)
非互換性
互換性のない変更点はありません。
バグと制約事項
バグは報告されていません。
提案やバグ報告の方法
何かバグを発見されたら、機能のご要望がありましたら、または改善のためのご意見がありましたら、メール(bug-dbicx-modeler-generator at rt.cpan.org
宛)で報告してください。 または、Webインターフェース(http://rt.cpan.org/Public/Bug/Report.html?Queue=DBICx-Modeler-Generator)を使って報告してください。 これによって、その報告内容が開発者へ通知されます。 さらに、バグや要望の対応状況について、報告者が通知を自動的に受けることも出来ます。
バグを報告いただく際には、もし可能であれば、バグを再現するための出来るだけ少量のサンプルコードを添えてください。 提案やパッチは勿論歓迎します。
サポート
このモジュールの文書はperldoc
コマンドで閲覧出来ます。
perldoc DBICx::Modeler::Generator
日本語版はPod::PerldocJpを使ったperldocjp
コマンドで閲覧出来ます。
perldocjp DBICx::Modeler::Generator.ja
また、以下の場所も参照してください:
- RT: CPAN's request tracker
-
http://rt.cpan.org/Public/Dist/Display.html?Name=DBICx-Modeler-Generator
- AnnoCPAN: Annotated CPAN documentation
- Search CPAN
- CPAN Ratings
バージョン管理
このモジュールはgitを使って保守されています。
最新版はgit://github.com/gardejo/p5-dbicx-modeler-generator.gitにあります。
コード網羅率
テストのコード網羅率(コードカバレッジ)を検査するために、Devel::Coverを使っています。 このディストリビューションのテストスートに関するDevel::Cover
による調査結果の概要を以下に示します。
---------------------------- ------ ------ ------ ------ ------ ------ ------
File stmt bran cond sub pod time total
---------------------------- ------ ------ ------ ------ ------ ------ ------
...BICx/Modeler/Generator.pm 100.0 n/a n/a 100.0 100.0 0.0 100.0
.../Modeler/Generator/CLI.pm 100.0 100.0 n/a 100.0 0.0 22.2 98.0
...odeler/Generator/Class.pm 100.0 n/a n/a 100.0 100.0 0.0 100.0
...er/Generator/ClassLike.pm 100.0 n/a n/a 100.0 n/a 0.0 100.0
.../Generator/Driver/Base.pm 100.0 100.0 n/a 100.0 100.0 0.0 100.0
...Generator/Driver/MySQL.pm 100.0 100.0 n/a 100.0 n/a 0.0 100.0
...enerator/Driver/SQLite.pm 100.0 n/a n/a 100.0 n/a 11.1 100.0
...r/Generator/DriverLike.pm 100.0 n/a n/a 100.0 n/a 0.0 100.0
...odeler/Generator/Model.pm 100.0 100.0 n/a 100.0 100.0 44.4 100.0
...er/Generator/ModelLike.pm 100.0 n/a n/a 100.0 n/a 0.0 100.0
...Modeler/Generator/Path.pm 100.0 100.0 n/a 100.0 100.0 0.0 100.0
...ler/Generator/PathLike.pm 100.0 n/a n/a 100.0 n/a 0.0 100.0
...deler/Generator/Schema.pm 100.0 50.0 n/a 100.0 100.0 22.2 97.6
...r/Generator/SchemaLike.pm 100.0 n/a n/a 100.0 n/a 0.0 100.0
...Modeler/Generator/Tree.pm 100.0 n/a n/a 100.0 n/a 0.0 100.0
...ler/Generator/TreeLike.pm 100.0 n/a n/a 100.0 n/a 0.0 100.0
Total 100.0 94.4 n/a 100.0 91.7 100.0 99.7
---------------------------- ------ ------ ------ ------ ------ ------ ------
著者
- 守屋 雅樹, MORIYA Masaki (a.k.a. Gardejo)
-
<moriya at ermitejo dot com>
, http://ttt.ermitejo.com/
著作権と使用許諾条件
Copyright (c) 2009 by MORIYA Masaki (a.k.a. Gardejo), http://ttt.ermitejo.com.
This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See perlgpl and perlartistic.
The full text of the license can be found in the LICENSE file included with this distribution.
このモジュールはフリーソフトウェアです。 あなたはこれをPerlと同じように自由に再配布・改変することが出来ます。 詳しくはperlgplおよびperlartisticを参照してください。
使用許諾条件の全文はこのディストリビューションに同梱されているLICENSEファイルにあります。
訳者
- 守屋 雅樹, MORIYA Masaki (a.k.a. Gardejo)
-
<moriya at ermitejo dot com>
, http://ttt.ermitejo.com/