ブログが続かないわけ

この日記のはてなブックマーク数
Webエンジニアが思うこと by junichiro on Facebook

DBICとDBIx::Class::Schema::Loader 僕のいろいろな勘違い

このエントリーを含むはてなブックマーク hateb
先日から、DBICに関するエントリをいくつかしているが、そこに大変参考になるトラックバックやコメントを頂いている。何となく理解しているつもりだった、Schema::Loader の仕組みなど、いくつか勘違いしているっぽいことがあったので、ここにまとめておく。

今日の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 にかかなきゃだめそうだ。
この記事のトラックバックURL
http://en.yummy.stripper.jp/trackback/550053
トラックバック
コメント









関連情報