Schemaの設定について2 #04B!

こんにちわ!nekokakです!

四日目はDBIx::Skinnyで使うschemaクラスの細かい設定方法の続きです。

install_inflate_ruleについて

DBIx::Skinnyにもカラムデータをinflate/deflateすることができます。

たとえば、birth_onのデータをDateTimeでinflate/deflateしたいとします。

DateTimeにinflateしたりとかは良くやりますよね。

package Proj::DB::Schema;
use DBIx::Skinny::Schema;
use DateTime;
use DateTime::Format::Strptime;
use DateTime::Format::SQLite;

install_table user => schema {
    pk 'id';
    columns qw/id name birth_on/;
};

install_inflate_rule '^.+_on$' => callback {
    inflate {
        my $value = shift;
        my $dt = DateTime::Format::Strptime->new(
            pattern   => '%Y-%m-%d %H:%M:%S',
            time_zone => 'Asia/Tokyo',
        )->parse_date($value);
        return DateTime->from_object( object => $dt );
    };
    deflate {
        my $value = shift;
        return DateTime::Format::MySQL->format_date($value);
    };
};

install_inflate_ruleでは対象とするカラムの名前を正規表現で書く事が出来ます。

この例の場合、全テーブルの_onのカラムを全てDateTimeにinflate/deflateさせる事になります。

triggerについて

DBIx::Skinnyではinsert/update/deleteを行うタイミングでtriggerアクションを設定できます。

今回は今までのテーブルにあらたにcreated_atというカラムを定義してみます。

そしてそのcreated_atにはデータがinsertされたタイミングで自動的にDateTime->nowが

設定されるようにします。

package Proj::DB::Schema;
use DBIx::Skinny::Schema;
use DateTime;
install_table user => schema {
    pk 'id';
    columns qw/id name birth_on created_at/;
    trigger pre_insert => sub {
        my ( $class, $args ) = @_;
        $args->{created_at} = DateTime->now;
    };
};

triggerを設定できる場所は

pre_insert/post_insert/pre_update/post_update/pre_delete/post_delete

となっていますので好きなタイミングにtriggerアクションを設定する事が出来ます。

また、triggerは1テーブルで複数のtriggerアクションを設定でき、

同じトリガーポイントに対しても複数アクションを設定できます。

install_common_triggerについて

triggerは基本テーブル単位に設定しますが、

全テーブル共通のtriggerを設定したい事もあると思います。

テーブルの設計方針で全テーブルにcreated_atを持たせる事が決められている場合、

いちいち各テーブルでtriggerを設定するのは面倒ですよね。

そこで登場するのがinstall_common_triggerです。

package Proj::DB::Schema;
use DBIx::Skinny::Schema;
use DateTime;
install_table user => schema {
    pk 'id';
    columns qw/id name birth_on created_at/;
};  
install_common_trigger pre_insert => sub {
    my ($self, $args, $table) = @_;
    # 一応本当にcreated_atがあるかチェックする
    my $columns = $self->schema->schema_info->{$table}->{columns};
    $args->{created_at} .= '_s'
        if grep {/^created_at$/} @$columns;
};

このようにinstall_common_triggerを利用すれば、

全テーブルに対して共通のtriggerを設定する事が可能です。

本日はここまで。

明日はDBIx::Skinnyを使った色々なデータ検索方法についてです。

have a nice skinny days!:)