DBIx::Class

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

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

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

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

   Аттрибуты   столбц...
Зачем нужен ORM?

 ORM сохраняет объекты в базу и достаёт их. Именно
 объекты, а не строки!!!
 Без него в нашем коде получ...
DBIx::Class

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

   DBIx::Class::Schema::Loader
   Таблицы => Классы
   Столбцы => Аттрибуты
   Комментарии к таблиц...
Basics

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

ResultSet - это структура для фор...
Начинаем работать

Классы:

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

Связки п...
Начинаем работать (строки)

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

package My::Schema::User;
__PACKAGE__->add_columns( qw(id name gender) );
__PACKAGE__->has_many( 'posts' => 'My...
Запросы

  $schema->resultset('User')->find($id)
  $v = $schema->resultset('Users')->search( { name => 'vasya' } );
  $v->...
Вкусняшки
Prefetch

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

my $posts = $schema->resultset('Posts');
foreach my $row ($posts->all) {
    s...
Всего один запрос

my $posts = $schema->resultset('Posts')->search(undef,{ 
    prefetch => {
        forum => 'moderator'...
Подзапросы

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

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

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

  Мы получаем тип данных из базы и превращаем его в
  красивый объект.
  И наоборот
 
Например, мы можем...
Выходим из резервации

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

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

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

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

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




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

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

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

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

                     Красная пилюля.
         Применять по крайней необходимости!
$rs->result_class...
Масштабирование

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

   $schema->storage_type( [
       '::DBI::Replicated',
       {balancer=>'::Random'}
   ] );
    $sc...
Profit!
DBIx::Class
Upcoming SlideShare
Loading in …5
×

DBIx::Class

2,080 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,080
On SlideShare
0
From Embeds
0
Number of Embeds
17
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

DBIx::Class

  1. 1. DBIx::Class Работаем с базой в стиле Perl
  2. 2. WTF is ORM? ORM = Объектно-реляционная проекция. Т.е. связка между реляционной БД и объектно-ориентированным кодом
  3. 3. Сравним RDB и OOP ООП РСУБД Объект База данных Тип название таблицы Аттрибуты столбцы Методы :-( нет у нас методов
  4. 4. Зачем нужен ORM? ORM сохраняет объекты в базу и достаёт их. Именно объекты, а не строки!!! Без него в нашем коде получается смесь двух совершенно разных языков - SQL и Perl. Это тупо неудобно! my $message = $user->messages->find( $message_id ); my $message = s("SELECT * FROM mess WHERE id=?",undef,$id"):
  5. 5. DBIx::Class Почему именно он? Самый популярный Большое количество плагинов Есть связки с Catalyst и HTML::FormFu Я це люблю™
  6. 6. Импорт структуры базы DBIx::Class::Schema::Loader Таблицы => Классы Столбцы => Аттрибуты Комментарии к таблицам => POD* Foreign-ключи => Связи между классами. * мой патч в последней версии Schema::Loader-а ;-P
  7. 7. Basics В DBIx::Class есть две основные сущности ResultSet (=where) Row (=object) ResultSet - это структура для формирования запроса.  Row - полученная из базы строка. 
  8. 8. Начинаем работать Классы: My::Schema::User My::Schema::Message My::Schema::Forum My::Schema::Reply Связки превращаются в методы: $user->messages, $message->replies, $reply->message;
  9. 9. Начинаем работать (строки) my @rows = $rs->all; $row->id $row->name $row->name( 'Изя' ) $row->update $row->delete $row->insert
  10. 10. Отношения 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' } );
  11. 11. Запросы $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
  12. 12. Вкусняшки
  13. 13. Prefetch Нам нужно сэкономить на запросах my $posts = $schema->resultset('Posts'); foreach my $row ($posts->all) {     say $post->forum->moderator->name; }
  14. 14. Всего один запрос my $posts = $schema->resultset('Posts')->search(undef,{      prefetch => {         forum => 'moderator'     } });   foreach my $post ( $posts->all ) {     say $post->forum->moderator->name; }
  15. 15. Подзапросы my $rs = $people->young->sexy->girls; $phone_db->search( { user_id => {     -in => $rs->as_query } } );
  16. 16. Paging Самая частая задача! Зачем её делать дважды? $resultset->search( { rows => 50 } ); $resultset->page(2); $resultset->pager (Data::Page);
  17. 17. Аггрегативные функции $posts->get_column('rating')->max;   $users->count;   $users->get_column('age')->avg;
  18. 18. Inflate, Deflate Мы получаем тип данных из базы и превращаем его в красивый объект. И наоборот   Например, мы можем прозрачно сохранять перловую структуру в каком-то поле!! man DBIx::Class::InflateColumn
  19. 19. Выходим из резервации плагины
  20. 20. DBIx::Class::FrozenColumns Прозрачно сохраняем дополнительные столбцы в одном поле $user->name; #этот столбец у нас лежит в базе $user->has_some_useless_property; # а этого - нет
  21. 21. DBIx::Class::DynamicSubclass В зависимости от какого-то флагового поля в базе, может создавать объекты других типов. Получаем записи из таблицы Animals, а они сразу bless- ятся в кошечек и собачек.
  22. 22. DBIx::Class::CustomPrefetch* Упрощение работы с несколькими СУБД. Аналог prefetch, но между базами                    
  23. 23. Отладка и оптимизация
  24. 24. ORM - гавно ( как сказал один дядька с Highload ) Итак,
  25. 25. Убедитесь, что дело в базе DBI_PROFILE=1 ./my_script.pl DBI::Profile: 0.046747s 2.34% (39 calls) comments_test.pl @ 2009-10-16 02:41:41
  26. 26. Если таки в базе DBIС_TRACE=1 ./my_script.pl  DBI_PROFILE=2 ./my_script.pl
  27. 27. Найдите медленные запросы man DBIx::Class::QueryLog
  28. 28. Тормоза в DBIx::Class Красная пилюля. Применять по крайней необходимости! $rs->result_class('DBIx::Class::ResultClass:: HashRefInflator');
  29. 29. Масштабирование = репликация
  30. 30. Включаем репликацию $schema->storage_type( [ '::DBI::Replicated', {balancer=>'::Random'} ] ); $schema->storage->connect_replicants( [$dsn1, $user, $pass, %opts], [$dsn2, $user, $pass, %opts], [$dsn3, $user, $pass, %opts], );
  31. 31. Profit!

×