#14 schema dumper
2011-12-14
先日Teng::Schema::Loaderの解説をしましたが、
TengにはTeng::Schema::Dumperというモジュールがあります。
Loaderはプログラム実行時に動的にdatabaseにschema情報を読み出し、
TengのSchemaクラスを構築しましたが、Dumperはdatabaseから読みだしたschema情報を
Teng::Schea::Declare形式で出力し、ファイルに保存して利用することを目的としています。
多くのテーブル定義がある場合、手でSchemaクラスを書くのは大変なので、
ある程度処理を自動化デキルようになっているのです。
Teng::Schema::Dumperは以下のように利用します。
#! perl use strict; use warnings; use DBI; use Teng::Schema::Dumper; my $dbh = DBI->connect('dbi:SQLite:./sample.db','',''); print Teng::Schema::Dumper->dump( dbh => $dbh, namespace => 'Proj::DB', ), "\n";
このようなスクリプトを書き実行すると、
package Proj::DB::Schema; use Teng::Schema::Declare; table { name 'user'; pk 'id'; columns ( 'id', 'name', 'created_at', 'updated_at', ); }; 1;
Teng::Schema::Declareをつかった構成のテキストが出力されるので、それをファイルに保存するだけです。
またtable毎にinflate/deflateの定義を挿し込みたい場合は以下のようにします。
#! perl use strict; use warnings; use DBI; use Teng::Schema::Dumper; my $dbh = DBI->connect('dbi:SQLite:./sample.db','',''); print Teng::Schema::Dumper->dump( dbh => $dbh, namespace => 'Proj::DB', inflate => +{ user => q| inflate qr/.+_at/ => sub { my ($col_value) = @_; }; deflate qr/.+_at/ => sub { my ($col_value) = @_; }; |,}, ), "\n";
こうすると、tableに対応したinfalte/deflateを埋め込むことができます。
package Proj::DB::Schema; use Teng::Schema::Declare; table { name 'user'; pk 'id'; columns ( 'id', 'name', 'created_at', 'updated_at', ); inflate qr/.+_at/ => sub { my ($col_value) = @_; }; deflate qr/.+_at/ => sub { my ($col_value) = @_; }; }; 1;
Teng::Schema::DumperはLoaderとやりたいことがほぼかぶっているので、機能の統一を考えています。
その為、若干無理やりやっている部分や微妙な部分がありますが、機能統一のタイミングで調整しようと思っています。
が、当面は静的にファイルを持ちたい場合にはDumperを利用するとよいでしょう。
明日はschemaのマイグレーションについての私の考えをまとめてみたいと思います