Schemaの設定について2 #04
こんにちわ!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!:)