最近のDB開発とTengとちょっとだけRedis

Kyoto.pm #5

Jul 13th, 2013

profile

Redisの話はしません

Recent output

Teng and DBIx::Class

typester likes DBIC.

社内では、去年Tengに傾いたものの、今年に入って揺り戻しがあって、 DBICが増えてる。新規でTeng使ってるの多分僕だけ><

僕の中で大分ノウハウが固まってきたのでその辺の話。 DBICきらいじゃないので、結構ゴツメの使い方。

スキーマ(DDL)管理 - use DBIx::Schema::DSL;

定義

package MyApp::Schema;
use DBIx::Schema::DSL;

create_table player => columns {
    primary_key 'id';
    varchar     'name';
};
1;

出力

% perl -ML -E 'say MyApp::Schema->output' > sql/myapp.sql

DBIx::Schema::DSL

メリット

デメリット

Migration - use GitDDL;

Tengのスキーマ定義 - use Teng::Schema::Loader;

partition切ってて、pkが id, created_atの時にちょっとおかしくなった時があったので 無理やり定義書き換えてidのみをpkに定義しなおしたりとかしてる。詳しいことは忘れた

JOIN - use Teng::Plugin::SearchJoined;

my $itr = $teng->search_joined(
    user_item => [
    item       => {'item.id' => 'user_item.item_id'},
], {
    'user_item.user_id' => 10,
});
# $itr->suppress_object_creation(1);
while (my ($user_item, $item) = $itr->next) {
    ...
}

Trigger - use Class::Method::Modifiers;

before on_update => sub {
    ...
};

ResultSet - use MyApp::DB::ResultSet;

DBICだと、Rowの集合みたいな概念があって結構便利。DBIC脳だと欲しくなる

my $rs = $teng->result_set('player');
$rs->single({id => 1});

は以下と等価

$teng->single(player, {id => 1});

例外処理 - use Exception::Tiny;

トランザクションとの連携 - DBIx::TransactionManager::EndHook

Teng便利!

ソースが把握しやすいし、拡張しやすいのが楽。

nekokakさん、cho45さん、tokuhiromさん、nihenさん、他のcontributorの皆様 ありがとうございます。

YAPCのTalkに応募しています

以上

ありがとうございました。

ご質問おねがいします!