DBIx::Skinny - simple OR mapper

YAPC::Asia 2009

2009-09-10

自己紹介

continued...

自己紹介

continued...

自己紹介

continued...

自己紹介

continued...

自己紹介

continued...

自己紹介

Skinnyってなに?

continued...

Skinnyってなに?

continued...

Skinnyってなに?

continued...

Skinnyってなに?

なんで作ったか

continued...

なんで作ったか

continued...

なんで作ったか

continued...

なんで作ったか

continued...

なんで作ったか

continued...

なんで作ったか

continued...

なんで作ったか

continued...

なんで作ったか

continued...

なんで作ったか

continued...

なんで作ったか

continued...

なんで作ったか

DBICの問題点

continued...

DBICの問題点

continued...

DBICの問題点

continued...

DBICの問題点

continued...

DBICの問題点

continued...

DBICの問題点

continued...

DBICの問題点

continued...

DBICの問題点

continued...

DBICの問題点

continued...

DBICの問題点

continued...

DBICの問題点

continued...

DBICの問題点

DBICの問題点(つづき

continued...

DBICの問題点(つづき

continued...

DBICの問題点(つづき

continued...

DBICの問題点(つづき

continued...

DBICの問題点(つづき

continued...

DBICの問題点(つづき

continued...

DBICの問題点(つづき

continued...

DBICの問題点(つづき

DBICの素晴らしい部分

continued...

DBICの素晴らしい部分

continued...

DBICの素晴らしい部分

continued...

DBICの素晴らしい部分

continued...

DBICの素晴らしい部分

continued...

DBICの素晴らしい部分

continued...

DBICの素晴らしい部分

continued...

DBICの素晴らしい部分

continued...

DBICの素晴らしい部分

continued...

DBICの素晴らしい部分

ただ....

continued...

ただ....

continued...

ただ....

continued...

ただ....

continued...

ただ....

そしてSkinnyへ

continued...

そしてSkinnyへ

continued...

そしてSkinnyへ

continued...

そしてSkinnyへ

continued...

そしてSkinnyへ

continued...

そしてSkinnyへ

continued...

そしてSkinnyへ

continued...

そしてSkinnyへ

continued...

そしてSkinnyへ

continued...

そしてSkinnyへ

continued...

そしてSkinnyへ

continued...

そしてSkinnyへ

前提

continued...

前提

continued...

前提

continued...

前提

continued...

前提

continued...

前提

continued...

前提

設計方針

continued...

設計方針

continued...

設計方針

continued...

設計方針

continued...

設計方針

continued...

設計方針

continued...

設計方針

continued...

設計方針

continued...

設計方針

ルールベースって?

continued...

ルールベースって?

continued...

ルールベースって?

continued...

ルールベースって?

continued...

ルールベースって?

continued...

ルールベースって?

continued...

ルールベースって?

continued...

ルールベースって?

continued...

ルールベースって?

なにはともあれ使い方

continued...

なにはともあれ使い方

package Your::Model;
use DBIx::Skinny setup => +{
    dsn      => 'dbi:mysql:blog',
    username => 'nekokak',
    password => 'password',
};
1;

schema設定

continued...

schema設定

package Your::Model::Schema;
use DBIx:Skinny::Schema;
# nop use modules ...
install_table blog => schema {
    pk 'id';
    columns qw/id guid title body created_at updated_at/;
    trigger pre_insert => callback {
        my ($class, $args) = @_;
        $args->{guid} = Data::GUID->new->as_base64_urlsafe;
        $args->{created_at} = DateTime->now(
            timezone => $timezone
        );
    };
};

schema設定続き..

continued...

schema設定続き..

# ....
install_tale tag => schema {
    pk 'id';
    columns qw/id guid name created_at updated_at/;
};
install_table blog_tag => schema {
    pk 'id';
    columns qw/id guid blog_id tag_id created_at updated_at/;
};

schema設定続き....

continued...

schema設定続き....

# ...
install_utf8_columns qw/title body name/;
install_inflate_rule '^.+_at$' => callback {
    inflate {
        my $value = shift;
        my $dt = DateTime::Format::Strptime->new(
            pattern  => '%Y-%m-%d %H:%M:%S',
            timezone => $timezone,
        );
    };
    deflate {
        my $value = shift;
        return DateTime::Format::MySQL->format_datetime($value);
    };
};

insert

continued...

insert

use Your::Model;
my $row = Your::Model->insert('blog',
    {
        title => 'YAPC::Asia 2008',
        body  => 'こんにちわnekokakです.云々',
    }
);

update

continued...

update

$row->update(
    {
        title => 'YAPC::Asia 2009',
    }
 )
continued...

update

  $row->update(
      {
          title => 'YAPC::Asia 2009',
      }
   )
オブジェクトから直接updateもできるし
continued...

update

  $row->update(
      {
          title => 'YAPC::Asia 2009',
      }
   )
オブジェクトから直接updateもできるし
continued...

update

  $row->update(
      {
          title => 'YAPC::Asia 2009',
      }
   )
オブジェクトから直接updateもできるし
Your::Model->update('blog',
      {
          title => 'YAPC::Asia 2009'
      },
      { id => $row->id, }
  );
continued...

update

  $row->update(
      {
          title => 'YAPC::Asia 2009',
      }
   )
オブジェクトから直接updateもできるし
 Your::Model->update('blog',
       {
           title => 'YAPC::Asia 2009'
       },
       { id => $row->id, }
   );
条件指定で一気にupdateもできる

delete

continued...

delete

$row->delete;
continued...

delete

 $row->delete;
オブジェクトから直接deleteもできるし
continued...

delete

 $row->delete;
オブジェクトから直接deleteもできるし
continued...

delete

 $row->delete;
オブジェクトから直接deleteもできるし
Your::Model->delete('blog',{id => $row->id});
continued...

delete

 $row->delete;
オブジェクトから直接deleteもできるし
 Your::Model->delete('blog',{id => $row->id});
条件を指定してまとめて消す事も出来る

select(search_by_sql)

continued...

select(search_by_sql)

my $itr = Your::Model->search_by_sql(
     q{
         SELECT title, body FROM blog WHERE id = ?
     },
     [$row->id]
 );
continued...

select(search_by_sql)

my $itr = Your::Model->search_by_sql(
     q{
         SELECT title, body FROM blog WHERE id = ?
     },
     [$row->id]
 );
continued...

select(search_by_sql)

my $itr = Your::Model->search_by_sql(
     q{
         SELECT title, body FROM blog WHERE id = ?
     },
     [$row->id]
 );
continued...

select(search_by_sql)

my $itr = Your::Model->search_by_sql(
     q{
         SELECT title, body FROM blog WHERE id = ?
     },
     [$row->id]
 );
continued...

select(search_by_sql)

my $itr = Your::Model->search_by_sql(
     q{
         SELECT title, body FROM blog WHERE id = ?
     },
     [$row->id]
 );

select(search_named)

continued...

select(search_named)

Your::Model->search_named(q{
      SELECT title, body FROM blog WHERE id = :id
  },{id => $row->id});
continued...

select(search_named)

Your::Model->search_named(q{
      SELECT title, body FROM blog WHERE id = :id
  },{id => $row->id});
continued...

select(search_named)

Your::Model->search_named(q{
      SELECT title, body FROM blog WHERE id = :id
  },{id => $row->id});
continued...

select(search_named)

Your::Model->search_named(q{
      SELECT title, body FROM blog WHERE id = :id
  },{id => $row->id});
continued...

select(search_named)

Your::Model->search_named(q{
      SELECT title, body FROM blog WHERE id = :id
  },{id => $row->id});
continued...

select(search_named)

Your::Model->search_named(q{
      SELECT title, body FROM blog WHERE id = :id
  },{id => $row->id});

select(search/single/count)

continued...

select(search/single/count)

Your::Model->search('blog',{id => $row->id});
continued...

select(search/single/count)

Your::Model->search('blog',{id => $row->id});
Your::Model->single('blog',{id => $row->id});
continued...

select(search/single/count)

Your::Model->search('blog',{id => $row->id});
Your::Model->single('blog',{id => $row->id});
Your::Model->count('blog', 'id', {});
continued...

select(search/single/count)

Your::Model->search('blog',{id => $row->id});
Your::Model->single('blog',{id => $row->id});
Your::Model->count('blog', 'id', {});

resultset

continued...

select(search/single/count)

Your::Model->search('blog',{id => $row->id});
Your::Model->single('blog',{id => $row->id});
Your::Model->count('blog', 'id', {});

resultset

continued...

select(search/single/count)

Your::Model->search('blog',{id => $row->id});
Your::Model->single('blog',{id => $row->id});
Your::Model->count('blog', 'id', {});

resultset

my $rs = Your:Model->resultset;
 $rs->add_select('blog.id' => 'blog_id');
 $rs->from(['blog']);
 $rs->add_where('blog.title' => 'YAPC::Asia 2009');
 my $itr = $rs->retrieve;
continued...

select(search/single/count)

Your::Model->search('blog',{id => $row->id});
Your::Model->single('blog',{id => $row->id});
Your::Model->count('blog', 'id', {});

resultset

my $rs = Your:Model->resultset;
 $rs->add_select('blog.id' => 'blog_id');
 $rs->from(['blog']);
 $rs->add_where('blog.title' => 'YAPC::Asia 2009');
 my $itr = $rs->retrieve;

find_or_create

continued...

find_or_create

continued...

find_or_create

Your::Model->find_or_create('user',
      {
          name  => 'nekokak',
          email => 'nekokak@gmail.cim',
      }
  );

bulk_insert

continued...

find_or_create

Your::Model->find_or_create('user',
      {
          name  => 'nekokak',
          email => 'nekokak@gmail.cim',
      }
  );

bulk_insert

Your::Model->bulk_insert('user',[{
      name  => 'nekokak',
      email => 'nekokak@gmail.com',
  },
  {
      name  => 'yappo',
      email => 'yappo@example.com',
  },]);

トランザクションサポート

continued...

トランザクションサポート

my $txn = Your::Model->txn_scope;
 my $row = Your::Model->single('blog', {id => 1});
 $row->set({title => 'やっぷしー2009'});
 $row->update;
 $txn->commit;

クラスベースorインスタンスベース

continued...

クラスベースorインスタンスベース

continued...

クラスベースorインスタンスベース

continued...

クラスベースorインスタンスベース

continued...

クラスベースorインスタンスベース

continued...

クラスベースorインスタンスベース

continued...

クラスベースorインスタンスベース

relationship

continued...

relationship

continued...

relationship

continued...

relationship

continued...

relationship

continued...

relationship

continued...

relationship

continued...

relationship

continued...

relationship

continued...

relationship

continued...

relationship

continued...

relationship

ラッパー

continued...

ラッパー

continued...

ラッパー

continued...

ラッパー

continued...

ラッパー

continued...

ラッパー

continued...

ラッパー

Skinnyの満足している部分

continued...

Skinnyの満足している部分

continued...

Skinnyの満足している部分

continued...

Skinnyの満足している部分

continued...

Skinnyの満足している部分

continued...

Skinnyの満足している部分

Skinnyの足りない部分

continued...

Skinnyの足りない部分

continued...

Skinnyの足りない部分

continued...

Skinnyの足りない部分

continued...

Skinnyの足りない部分

continued...

Skinnyの足りない部分

continued...

Skinnyの足りない部分

continued...

Skinnyの足りない部分

continued...

Skinnyの足りない部分

continued...

Skinnyの足りない部分

DBIx::Skinnyまとめ

continued...

DBIx::Skinnyまとめ

continued...

DBIx::Skinnyまとめ

continued...

DBIx::Skinnyまとめ

continued...

DBIx::Skinnyまとめ

continued...

DBIx::Skinnyまとめ

continued...

DBIx::Skinnyまとめ

That's All