Schema::Loader 使い方

mizzy.org : Re: DBICとDBIx::Class::Schema::Loader 僕のいろいろな勘違い

僕の中で流行ってる使い方があるのでかぶせて書いておいてみる。mizzy さんの二個目の例を自分ルール化させた感じ?

作業は一般的なCatalystアプリのディレクトリ構造上であるとして、そこに新しく schema というディレクトリを作成。

そんで、

  • schema/lib/Schema/{TableName}.pm

に各テーブルのリレーション定義とかメソッドとかを自分で書く。実際にこのライブラリは Catalyst にロードされない。

上記ファイルを元に Schema::Loadermake_schema_at を使い

  • lib/MyApp/Schema.pm
  • lib/MyApp/Schema/*.pm

にコードを自動生成して、そちらをロードするという感じ。こちらのコードは自分では書き換えない。

コード自動生成は script/myapp_update_schema.pl にこんなのを書いてそれを実行している。

#!/usr/bin/env perl

use strict;
use warnings;

use FindBin;
use File::Spec;
use lib File::Spec->catfile( $FindBin::Bin, qw/.. schema lib/ );

use DBIx::Class::Schema::Loader qw/make_schema_at/;

die unless @ARGV;

make_schema_at(
    'MyApp::Schema',
    {   components     => ['ResultSetManager', 'UTF8Columns'],
        dump_directory => File::Spec->catfile( $FindBin::Bin, '..', 'lib' ),
        dump_overwrite => 1,
        debug => 1,
    },
    \@ARGV,
);

@INCschema/lib をくっつけてから make_schema_at してるだけ。ワンライナーでもできるけど見通しが悪いので。

これで普通の make_schema_at でつくられる Schema ファイルに自分で schema/lib/Schema/ 以下に書いた定義がくっついて出力されるという寸法。

Schema::Loader でダイナミックロードを使っていると各テーブルクラスにはリレーション定義やメソッド拡張のコードだけをかけばいいのでシンプルになって好きなんだけど、そうすると起動時のオーバーヘッドがあるし、ResultSetManagerがつかえなくていやんというときに、これだとまぁイイとこどりのような感じにできる。

実際にいじるファイルは schema/lib 以下のファイルで、それらのファイルを更新するたびに update.pl を実行するというのがあれだけどまぁ自動化できる。してないけど。

難点は、schema/lib 以下のファイルでsyntax errorがあっても何も言われないこと。

何も言われないというか、syntax error があるファイルは

# Loaded external class definition for 'MyApp::Schema::TableName'

ってのが出ないだけという。どこがエラってるのかとかがわからないので、がーーって書いてどこか typo してたりするとはまるかも。

by typester / at 2007-05-07T04:57:00 / perl · dbic / Comments(0)