2007.05.06 Sunday
先日から、DBICに関するエントリをいくつかしているが、そこに大変参考になるトラックバックやコメントを頂いている。何となく理解しているつもりだった、Schema::Loader の仕組みなど、いくつか勘違いしているっぽいことがあったので、ここにまとめておく。
今日のCPANモジュール|use DBIx::Class;
そうだね。ここまではいい。スキーマクラスはしっかりと用意している。ただ、このスキーマクラスに対する理解がちょっと違ったみたいだ。
自動の場合は、DBIx::Class::Schema::Loader を継承し
手動の場合は、DBIx::Class::Schema を継承するとのこと。
ん?2種類のスキーマクラス?
ここでは、スキーマクラス自体に手動型と自動型、2つの種類があると言っている。僕の理解では、スキーマクラスは1種類(手動型)だけで、これを本当に手動で作るか、自動で作るかという違いがあるだけだと思っていた。
そして僕は下記の記事を見て、スキーマクラスを自動生成させていた。
既存 DB から以下のワンライナー一発で DBIx::Class の Schema が生成できる
確かにここではDBIx::Class::Schema::Loaderを使っている。しかし、実際の自分のコードを見てみると
僕はDBIx::Class::Schema::Loader を使って自動で「手動型」のスキーマを作っていたのだ。実は、僕はSchema::Loader というのはスキーマを自動生成するためのツールだと思っていたので、自動型の(DBIx::Class::Schema::Loaderを継承する)スキーマの存在を知らなかったのだ。
前回のエントリでInflate を自動化したいといったときに、コメントでその方法を教えて頂いたのだが、いまいちピンとこなかったのが理解できた。
このコメントを見たときに、またSchema::Loaderでスキーマを作り直さなければならないと思っていたので、あまり便利じゃないと思っていた。しかし、これはDBIx::Class::Schema::Loader を継承している自動型であれば、そこでcomponents を指定するだけで万事OKということなのだった。
理解ができてとてもスッキリした。
とはいえ、僕の稼働中のアプリはすでに手動型のSchema で動いている。スキーマを作り直したら、リレーションの設定を全てしなおさなければならないので、それは現実的じゃない。inflate, deflate の指定は、やっぱりすべてのSchema にかかなきゃだめそうだ。
今日のCPANモジュール|use DBIx::Class;
事前に「データベース」に対応したクラス(スキーマクラス)や、「テーブル」に対応したクラスを用意しておき、プログラムではそいつらを通して DB にアクセスします。
そうだね。ここまではいい。スキーマクラスはしっかりと用意している。ただ、このスキーマクラスに対する理解がちょっと違ったみたいだ。
この対応クラスを用意するには手動と自動の2種類あります
自動の場合は、DBIx::Class::Schema::Loader を継承し
手動の場合は、DBIx::Class::Schema を継承するとのこと。
ん?2種類のスキーマクラス?
ここでは、スキーマクラス自体に手動型と自動型、2つの種類があると言っている。僕の理解では、スキーマクラスは1種類(手動型)だけで、これを本当に手動で作るか、自動で作るかという違いがあるだけだと思っていた。
そして僕は下記の記事を見て、スキーマクラスを自動生成させていた。
既存 DB から以下のワンライナー一発で DBIx::Class の Schema が生成できる
確かにここではDBIx::Class::Schema::Loaderを使っている。しかし、実際の自分のコードを見てみると
use base 'DBIx::Class::Schema';となっていた。DBIx::Class::Schema を継承していた。つまり先の記事によると、これは手動型だ。
僕はDBIx::Class::Schema::Loader を使って自動で「手動型」のスキーマを作っていたのだ。実は、僕はSchema::Loader というのはスキーマを自動生成するためのツールだと思っていたので、自動型の(DBIx::Class::Schema::Loaderを継承する)スキーマの存在を知らなかったのだ。
前回のエントリでInflate を自動化したいといったときに、コメントでその方法を教えて頂いたのだが、いまいちピンとこなかったのが理解できた。
Schema::Loader で components に InflateColumn::DateTime を指定してあげるだけで OK です。
このコメントを見たときに、またSchema::Loaderでスキーマを作り直さなければならないと思っていたので、あまり便利じゃないと思っていた。しかし、これはDBIx::Class::Schema::Loader を継承している自動型であれば、そこでcomponents を指定するだけで万事OKということなのだった。
理解ができてとてもスッキリした。
とはいえ、僕の稼働中のアプリはすでに手動型のSchema で動いている。スキーマを作り直したら、リレーションの設定を全てしなおさなければならないので、それは現実的じゃない。inflate, deflate の指定は、やっぱりすべてのSchema にかかなきゃだめそうだ。