DBIx::Class

Работаем с базой в стиле Perl
WTF is ORM?

ORM = Объектно-реляционная проекция. Т.е. связка
между реляционной БД и объектно-ориентированным
кодом
Сравним RDB и OOP
   ООП         РСУБД

   Объект      База данных

   Тип         название таблицы

   Аттрибуты   столбцы



   Методы      :-( нет у нас методов
Зачем нужен ORM?

 ORM сохраняет объекты в базу и достаёт их. Именно
 объекты, а не строки!!!
 Без него в нашем коде получается смесь двух
 совершенно разных языков - SQL и Perl.
 Это тупо неудобно!
 my $message = $user->messages->find( $message_id );
 my $message = s("SELECT * FROM mess WHERE id=?",undef,$id"):
DBIx::Class

Почему именно он?
  Самый популярный
  Большое количество плагинов
  Есть связки с Catalyst и HTML::FormFu
  Я це люблю™
Импорт структуры базы

   DBIx::Class::Schema::Loader
   Таблицы => Классы
   Столбцы => Аттрибуты
   Комментарии к таблицам => POD*
   Foreign-ключи => Связи между классами.




* мой патч в последней версии Schema::Loader-а ;-P
Basics

В DBIx::Class есть две основные сущности
   ResultSet (=where)
   Row (=object)

ResultSet - это структура для формирования запроса. 

Row - полученная из базы строка. 
DBIx::Class
Начинаем работать

Классы:

   My::Schema::User
   My::Schema::Message
   My::Schema::Forum
   My::Schema::Reply

Связки превращаются в методы:

$user->messages, $message->replies, $reply->message;
Начинаем работать (строки)

my @rows = $rs->all;
   $row->id
   $row->name
   $row->name( 'Изя' )
   $row->update
   $row->delete
   $row->insert
Отношения

package My::Schema::User;
__PACKAGE__->add_columns( qw(id name gender) );
__PACKAGE__->has_many( 'posts' => 'My::Schema::Posts', 'user_id' );
__PACKAGE__->belongs_to( gender => 'My::Schema::Genders' );
1;
 ...
say $user->gender->name; #male
say $user->posts->first->title; # Как размножаются ёжики?
$user->add_to_posts( { title => 'RE: Как размножаются ёжики' } );
$user->posts->find( $post_id );
$user->search_related('posts')->search_related('comments', { order_by =>
'date' } );
Запросы

  $schema->resultset('User')->find($id)
  $v = $schema->resultset('Users')->search( { name => 'vasya' } );
  $v->search( { gender => 'f' } )->count;
  $user->messages->search( { text => { like => '%yandex%' } } )->delete;




man DBIx::Class::ResultSet
Вкусняшки
Prefetch

Нам нужно сэкономить на запросах

my $posts = $schema->resultset('Posts');
foreach my $row ($posts->all) {
    say $post->forum->moderator->name;
}
Всего один запрос

my $posts = $schema->resultset('Posts')->search(undef,{ 
    prefetch => {
        forum => 'moderator'
    }
});
 
foreach my $post ( $posts->all ) {
    say $post->forum->moderator->name;
}
Подзапросы

my $rs = $people->young->sexy->girls;
$phone_db->search( { user_id => {
    -in => $rs->as_query
} } );
Paging

 Самая частая задача!
 Зачем её делать дважды?
 $resultset->search( { rows => 50 } );
 $resultset->page(2);
 $resultset->pager (Data::Page);
Аггрегативные функции

$posts->get_column('rating')->max;
 
$users->count;
 
$users->get_column('age')->avg;
Inflate, Deflate

  Мы получаем тип данных из базы и превращаем его в
  красивый объект.
  И наоборот
 
Например, мы можем прозрачно сохранять перловую
структуру в каком-то поле!!
man DBIx::Class::InflateColumn
Выходим из резервации

       плагины
DBIx::Class::FrozenColumns

 Прозрачно сохраняем дополнительные столбцы в
 одном поле
 $user->name; #этот столбец у нас лежит в базе
 $user->has_some_useless_property; # а этого - нет
DBIx::Class::DynamicSubclass

В зависимости от какого-то флагового поля в базе,
может создавать объекты других типов.
Получаем записи из таблицы Animals, а они сразу bless-
ятся в кошечек и собачек.
DBIx::Class::CustomPrefetch*

Упрощение работы с несколькими СУБД. Аналог
prefetch, но между базами
 
 
 
 
 
 
 
 
 
 
Отладка и оптимизация
ORM - гавно

      ( как сказал один дядька с Highload )




                     Итак,
Убедитесь, что дело в базе

DBI_PROFILE=1 ./my_script.pl
DBI::Profile: 0.046747s 2.34% (39 calls) comments_test.pl
@ 2009-10-16 02:41:41
Если таки в базе

DBIС_TRACE=1 ./my_script.pl 
DBI_PROFILE=2 ./my_script.pl
Найдите медленные запросы

man DBIx::Class::QueryLog
Тормоза в DBIx::Class

                     Красная пилюля.
         Применять по крайней необходимости!
$rs->result_class('DBIx::Class::ResultClass::
HashRefInflator');
Масштабирование

   = репликация
Включаем репликацию

   $schema->storage_type( [
       '::DBI::Replicated',
       {balancer=>'::Random'}
   ] );
    $schema->storage->connect_replicants(
[$dsn1, $user, $pass, %opts],
[$dsn2, $user, $pass, %opts],
[$dsn3, $user, $pass, %opts],
);
Profit!

More Related Content

PDF
Укрощение XML
PPT
PPTX
Base php 0
PPTX
Base php 0
PDF
11 - Web-технологии. Работа с СУБД
PDF
Что нового в Perl? 5.10 — 5.16
Укрощение XML
Base php 0
Base php 0
11 - Web-технологии. Работа с СУБД
Что нового в Perl? 5.10 — 5.16

What's hot (9)

PPT
Что нового в PHP-5.3
PDF
WordPress Kitchen 2014 - Дмитрий Корельский: Ангулярность WordPress бытия
PPT
PHP Tricks
PPTX
О безопасном использовании PHP wrappers
PDF
12 - Web-технологии. Django модели
PPTX
Drupal 8 API для разработчиков
PDF
Разработка на Perl под Raspberry PI
PPTX
PHP Advanced
Что нового в PHP-5.3
WordPress Kitchen 2014 - Дмитрий Корельский: Ангулярность WordPress бытия
PHP Tricks
О безопасном использовании PHP wrappers
12 - Web-технологии. Django модели
Drupal 8 API для разработчиков
Разработка на Perl под Raspberry PI
PHP Advanced

Similar to DBIx::Class (20)

PPT
Rose::DB
PDF
Aleksey Mashanov Rit
PDF
Aleksey Mashanov Rit
PDF
Web осень 2013 лекция 6
PPT
Catalyst and Rose::DB
PDF
Anton Tsitou "Cycle ORM and Graphs"
PPT
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
PPT
Толстая модель. История разработки ORM
ODP
Работа с БД в Drupal 7
KEY
Sequel — механизм доступа к БД, написанный на Ruby
PPT
ORM: благо или зло?
PPTX
СУБД 2013 Лекция №1 "Введение и начало проектирования"
PDF
SQL. Django, начало
PDF
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
PPTX
СУБД осень 2012 лекция 1
PPTX
Особенности совместной работы Ruby и Oracle
PPTX
django-and-postgresql
PPTX
C++ и базы данных
PPTX
PHP and MySQL
PPT
Базы данных лекция №11
Rose::DB
Aleksey Mashanov Rit
Aleksey Mashanov Rit
Web осень 2013 лекция 6
Catalyst and Rose::DB
Anton Tsitou "Cycle ORM and Graphs"
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
Толстая модель. История разработки ORM
Работа с БД в Drupal 7
Sequel — механизм доступа к БД, написанный на Ruby
ORM: благо или зло?
СУБД 2013 Лекция №1 "Введение и начало проектирования"
SQL. Django, начало
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
СУБД осень 2012 лекция 1
Особенности совместной работы Ruby и Oracle
django-and-postgresql
C++ и базы данных
PHP and MySQL
Базы данных лекция №11

DBIx::Class