新しいblogに移行しました

新ブログ "All Yout Bugs Are Belong To Ass" に移行しました!

2009-12-30

[Perl]Data::ModelをMouseでextendsしたけどあんまり意味なかった。というメモ。

表題のとおり、これだけでは意味が無いです。ただextendsしました。と言うだけの話。
後学の為のメモとして残します。

まず、Data::ModelをextendsしたMyDBクラス。

$ cat ./lib/MyDB.pm
package MyDB;

use Data::Model::Schema;

install_model member => schema {
key 'id';
columns qw(
id name sex age
);
};

use Mouse;
extends 'Data::Model';

__PACKAGE__->meta->make_immutable( inline_constructor => 0 );

no Mouse;

1;
__END__


MyDBクラスを使ってSQLite上のデータを書き換えるスクリプト。

$ cat hoge.pl
#!/usr/bin/perl

use FindBin;
use lib ("$FindBin::Bin/lib");
use MyDB;
use Data::Dumper;
use Data::Model::Driver::DBI;

my $dbfile = "$FindBin::Bin/mydb.sqlite3";
my $driver = Data::Model::Driver::DBI->new(
dsn => "dbi:SQLite:$dbfile",
);

my $db = MyDB->new;
$db->set_base_driver( $driver );
print Dumper( $db->lookup( member => 1 ) );
my $rec = $db->lookup( member => 1 );
$rec->name( 'YellowTurtle' );
$rec->update;

print Dumper( $db->lookup( member => 1 ) );


実行結果。

$ ./hoge.pl
$VAR1 = bless( {
'alias_values' => {},
'column_values' => {
'name' => 'ytnobody',
'id' => '1',
'sex' => '29',
'age' => '1'
},
'original_cols' => {},
'changed_cols' => {},
'model' => bless( {
'schema_class' => 'MyDB'
}, 'MyDB' )
}, 'MyDB::member' );
$VAR1 = bless( {
'alias_values' => {},
'column_values' => {
'name' => 'YellowTurtle',
'id' => '1',
'sex' => '29',
'age' => '1'
},
'original_cols' => {},
'changed_cols' => {},
'model' => bless( {
'schema_class' => 'MyDB'
}, 'MyDB' )
}, 'MyDB::member' );

2009-12-26

[Perl]Data::Model::Tutorial::JAを読もう

今更ながら、Data::Model::Tutorial::JAを読んだ。
で、Data::ModelのGJなところを再発見したのでメモ。

Schema定義からCREATE TABLEを発行できる


アプリのセットアップで手抜きできますね。

set_base_driverメソッドの存在


Data::ModelにDriver(DBIやらCache::Memcachedやら)を後付けで食わせることができます。
Driver定義は、DB1つのみであれば1つだけ定義すればOK。管理上も楽できそうです。
ある日突然上司から、DBをMySQLからSQLiteに移行するように言われたりしても、Driver定義だけ書き換えればOK。これでもう悩み無用です。

column定義はSchema定義と分離可能


column定義の使いまわしができます。同じような構造のcolumn定義を何度も書くようなアホらしいことを避ける事が可能です。

cacheを挟み込むことができるようになるらしい?


DBI や Memcached のストレージへのアクセスするさいに Memcached などのキャッシュを 挟む事が出来ます。の、予定。

そもそもDBへクエリを投げて、ステートメントハンドラを受け取るという処理は、Memcachedにおけるgetやset等と比較すると、決して軽いものではないです。
ここで予定されている仕組みが実装されると、そんなDBへの問い合わせの頻度自体を減らすことができ、結果的にアプリケーションの高速化およびDBサーバの負荷軽減につながります。

2009-12-24

[Perl]せっかくだから、俺はこのData::Modelを選ぶぜ!

ちょうど、「オレオレなO/Rマッパーを作るべきか。諦めてDBICの軍門に降るべきか・・・」などとボヤいていた矢先、yappoさんのエントリ http://blog.yappo.jp/yappo/archives/000703.html を読んで、試してみました。
もともとCDBIもDBICも肌に合わなくて、DBIx::SimpleというモジュールをMouseで拡張したりして使っていたんですが(そのせいで若干O/Rマッパーアレルギー気味だった)、今やすっかりData::Model厨となりつつあります。

何が良かったのか。完全に一人称視点で列挙してみます。

・テーブルごとにSchemaクラスを分けなくてよい。
CDBIもDBICもテーブルごとにクラス分けをするのが前提のようですが、そもそもそこまでする必要の無いことが殆どです。
Data::Model::SchemaはDSL的な記述でSchemaを定義できます。
そもそもCDBIもDBICもSchemaの定義がちっともエレガントとは思えない。オイラがこれまでO/Rマッパーを毛嫌いしていたのは、この辺に原因があります。

・Memcachedドライバがある。
今ブームのKVSをデータドライバとして扱えます。
Cache::Mamcached::Fastを食わせれば、"Memcached"もさることながら"Tokyo Tyrant"にだってデータを格納できるわけです。

・Q4Mドライバがある。
まだオイラはQ4M自体を本格的に触っていないものの、他のO/Rマッパーではおそらくサポートしていないであろうと思われる機能です。
これによって透過的にQ4Mを利用できるものと思われます。

どうでもいいけど、

>そんな手垢のついたものばっかり使ってるから君は世界三位の位置にいつまでたってもつけないんだよ。

と言っても、ちっとも嫌味に聞こえないのがすげえ。