ユーコンブレンド 100g

by typester / at 2006-06-23T14:43:00 / life · starbucks / Comment

NEXT, Class::C3 のいいとこ

redefineが楽チン。

てかダメダメいってたけど最近はそうでもなくなってきた。

by typester / at 2006-06-23T13:13:00 / perl / Comment

出社。

by typester / at 2006-06-23T11:49:00 / life / Comment

退社。

by typester / at 2006-06-23T03:48:00 / life / Comment

マルチ language なアプリを作る練習もかねて、ちょっとしたサイトつくりはじめたんだけど、

msgid  "Logged in as %1"
msgstr "%1 としてログインしています"

こういうのが化ける。%1 とかはいってないのはいける。Unicodeフラグっぽい化けかたなので、MyApp.pm に

sub localize {
    my $c    = shift;
    my $text = shift;

    my $args = ref $_[0] eq 'ARRAY' ? $_[0] : [@_];

    for my $arg (@$args) {
        utf8::decode($arg);# unless utf8::is_utf8($arg);
    }

    $c->NEXT::localize( $text, $args );
}

とか書いてみたら直ったよ。しかし、is_utf8 のところコメント外すとうごかねーよ、なにこれ。

$args には is_utf8 は真だけど、perl utf8 じゃないのがはいってる?何かが悪さをしておる。

Unicode プラグインと併用してるのがまずいのかもしれん。

by typester / at 2006-06-23T02:47:00 / perl · catalyst / Comment

出社。

by typester / at 2006-06-22T13:06:00 / life / Comment

退社。

by typester / at 2006-06-22T00:57:00 / life / Comment

Schema::Loader with Catalyst

Catalyst::Model::DBIC::Schema を使う。

この Model は大きく3つの使いかたがある。

  1. 単純に既に存在する Schema クラスを使用する
  2. Schema::Loader で既存の DB から Schema クラスを生成し、それを使用する
  3. Schema::Loader で既存の DB から Schema::Loader クラスを生成し、それを利用する。

1 はまず Schema クラスをどこかに作ってあり(My::Schemaと仮定する)、それをそのまま Catalyst::Model として利用する。

./script/myapp_create.pl model DBIC DBIC::Schema My::Schema

で、MyApp::Model::DBIC が作成される。この My::Schema に connection なんかが定義されていてそれを使う場合はこのままでOK。

別の接続先を使う場合なんかは MyApp::Model::DBIC の設定で connect_info を書いておけばそっちが使われる。ヘルパーの最後に

./script/myapp_create.pl model DBIC DBIC::Schema My::Schema dbi:SQLite:/path/to/foo.db

とかしてもOK。

で、これでアプリ内から Schema クラスを使える。で、この場合で My::Schema::Table を使うには $c->model('DBIC::Table')->search とかとする。ここがわかりにくいのかもしれない。

2 は 1 と同じだが、ヘルパーを叩くときに既存DBを元にSchemaクラスを生成する。

./script/myapp_create.pl model DBIC DBIC::Schema My::Schema create=static dbi:SQLite:myapp.db

こんな感じで、ヘルパーを叩いたときに、myapp.db のテーブル定義をもとに My::Schema(::*) クラスが自動生成される。後の使いかたは同じ。

3 は Schema クラスではなく、Schema::Loader クラスを生成し、Catalystアプリが起動するたびにDBのテーブル定義を見て動的にSchemaクラスを生成する。Catalyst::Model::CDBI みたいな感じ。

これを使うには

./script/myapp_create.pl model DBIC DBIC::Schema My::Schema create=dynamic dbi:SQLite:myapp.db

で、My::Schema という Schema::Loader クラスが生成され、それが使われる。

Catalystアプリからの使いかたはすべて1と同じ。

My::Schema::* をよぶのに、$c->model('DBIC::*') を呼ぶというのがわかりずらいのかも。

あと、Schema::Loader を使う場合、テーブル定義以外の、リレーションの設定とかインフレーションとかの設定を書くために、My::Schema::Table を書くかもしれないが、CDBI::Loader と違いそれらはデフォルトでは読み込まれないから注意が必要。

それらをロードするためには、My::Schema に __PACKAGE__->load_classes; を付け加える必要がある。

たしかになんかわかりにくいかも。かなぁ。

  • Schema based な DBIC の使いかたの例: DBIx::Class::Manual::Example
  • C::M::Schema::Loader: Catalyst::Model::Schema::Loader
  • とそのヘルパー: Catalyst::Helper::Model::Schema::Loader

とかの pod を見るといいかも。

by typester / at 2006-06-21T11:40:00 / perl · catalyst / Comment

出社。

by typester / at 2006-06-21T11:21:00 / life / Comment

on_connect_do

で、下記の PRAGMA synchronous = off だとか、MySQL の SET NAMES utf8 みたいなのを DBIC でやるばあいは

$schema->storage->on_connect_do( ['SET NAMES utf8'] );

みたいにするわけだけど、これは今はschemaクラス自体には書いておけないのでめんどくさい。(0.699..のほうではできるようになっている)

Catalyst でつかうだけなら、今の DBIC でも、Model::DBIC::Schema の connect_infoon_connect_do を書いておける。

connect_info => [
    'dbi:SQLite:dbname=foo.db',
    { on_connect_do => [ 'PRAGMA synchronous = OFF', ], }
],

blblack++

by typester / at 2006-06-20T19:17:00 / perl · dbic / Comment

94 95 96 97 98 99 100 101 102 103

(Page 98 of 203)