SlideShare una empresa de Scribd logo
1 de 32
Descargar para leer sin conexión
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 - полученная из базы строка. 
Начинаем работать

Классы:

   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!

Más contenido relacionado

La actualidad más candente

Что нового в PHP-5.3
Что нового в PHP-5.3 Что нового в PHP-5.3
Что нового в PHP-5.3 phpclub
 
WordPress Kitchen 2014 - Дмитрий Корельский: Ангулярность WordPress бытия
WordPress Kitchen 2014 - Дмитрий Корельский: Ангулярность WordPress бытияWordPress Kitchen 2014 - Дмитрий Корельский: Ангулярность WordPress бытия
WordPress Kitchen 2014 - Дмитрий Корельский: Ангулярность WordPress бытияWordCamp Kyiv
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
О безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersО безопасном использовании PHP wrappers
О безопасном использовании PHP wrappersPositive Hack Days
 
12 - Web-технологии. Django модели
12 - Web-технологии. Django модели12 - Web-технологии. Django модели
12 - Web-технологии. Django моделиRoman Brovko
 
Drupal 8 API для разработчиков
Drupal 8 API для разработчиковDrupal 8 API для разработчиков
Drupal 8 API для разработчиковDrupalSPB
 
Разработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIРазработка на Perl под Raspberry PI
Разработка на Perl под Raspberry PIIlya Chesnokov
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP AdvancedNoveo
 

La actualidad más candente (9)

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

Similar a DBIx::Class

LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)Sergey Skvortsov
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Rupyru2007 Rastyagaev Ruby
Rupyru2007 Rastyagaev RubyRupyru2007 Rastyagaev Ruby
Rupyru2007 Rastyagaev Rubyemarkine
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Alex Ott
 
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Fedor Lavrentyev
 
Ruby on Rails. Работа с моделями — продолжение
Ruby on Rails. Работа с моделями — продолжениеRuby on Rails. Работа с моделями — продолжение
Ruby on Rails. Работа с моделями — продолжениеDigital-агентство Мэйк
 
Толстая модель. История разработки ORM
Толстая модель. История разработки ORMТолстая модель. История разработки ORM
Толстая модель. История разработки ORMMikhail Shamin
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf Conference
 
Ldap And Infrastructure
Ldap And InfrastructureLdap And Infrastructure
Ldap And InfrastructureLiudmila Li
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьTanya Denisyuk
 
Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Ilyas Salikhov
 
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)Symfoniacs
 

Similar a DBIx::Class (20)

Catalyst and Rose::DB
Catalyst and Rose::DBCatalyst and Rose::DB
Catalyst and Rose::DB
 
LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
бегун
бегунбегун
бегун
 
Jdbc in java
Jdbc in javaJdbc in java
Jdbc in java
 
Administrarea DSpace
Administrarea DSpaceAdministrarea DSpace
Administrarea DSpace
 
Rupyru2007 Rastyagaev Ruby
Rupyru2007 Rastyagaev RubyRupyru2007 Rastyagaev Ruby
Rupyru2007 Rastyagaev Ruby
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
 
Ruby on Rails. Работа с моделями — продолжение
Ruby on Rails. Работа с моделями — продолжениеRuby on Rails. Работа с моделями — продолжение
Ruby on Rails. Работа с моделями — продолжение
 
176023
176023176023
176023
 
Толстая модель. История разработки ORM
Толстая модель. История разработки ORMТолстая модель. История разработки ORM
Толстая модель. История разработки ORM
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
 
Ldap And Infrastructure
Ldap And InfrastructureLdap And Infrastructure
Ldap And Infrastructure
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
Backbone js
Backbone jsBackbone js
Backbone js
 
Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2Расширенное кеширование в Doctrine2
Расширенное кеширование в Doctrine2
 
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
Расширенное кеширование Doctrine2 (Ильяс Салихов, Intaro)
 

DBIx::Class