Catalyst and Rose::DB сборка
Rose::DB <ul><li>Описание работы с  ORM  смотри </li></ul><ul><li>здесь </li></ul>
Rose::DB  (+) <ul><li>Значительно быстрее, чем  DBIx::Class </li></ul><ul><li>Проще в формировании запросов </li></ul><ul>...
Rose::DB  (-) <ul><li>Пересоздание классов таблиц затрёт все добавленные программистом методы (в отличие от  DBIx::Class )...
Прикручиваем к  Catalyst <ul><li>Допустим, вы правильно раскурили мануалы по  Rose::DB , и всё ещё хотите прикрутить именн...
Прикручиваем к  Catalyst <ul><li>Приблизительная структура папок   Вашего проекта: </li></ul>View/ Model/ Controller/ MLis...
Прикручиваем к  Catalyst <ul><li>Нам потребуются 2 модуля. В одном из них ( RDB.pm ) будет описан коннект, во втором  ( RD...
Прикручиваем к  Catalyst <ul><li>Создаём модель  RDBBase </li></ul><ul><li>$ cd /any_path/MList </li></ul><ul><li>$ script...
Прикручиваем к  Catalyst <ul><li>Итого у вас получилось следующее: </li></ul>RDB.pm RDBBase.pm View/ Model/ Controller/ ML...
Прикручиваем к  Catalyst <ul><li>Теперь создаём скрипт, который выльет нам структуру базы в классы  Rose::DB::Object , исп...
Прикручиваем к  Catalyst <ul><li>use lib  –  позволяет подгрузить созданные модули. </li></ul><ul><li>make_modules  –  это...
Использование <ul><li>Допустим у вас в базе была таблица  ml_persons . Тогда для неё будут созданы 2 модуля: </li></ul><ul...
Использование <ul><li>Итого у вас получилось следующее: </li></ul>Manager.pm MlPerson.pm MlPerson/ … RDB.pm RDBBase.pm RDB...
Использование <ul><li>И, напоследок, вспомним про необязательный метод: </li></ul><ul><li>sub custom_rdb_manager {$_[0].':...
Upcoming SlideShare
Loading in …5
×

Catalyst and Rose::DB

1,116 views
1,019 views

Published on

Создаём для Catalyst модель на orm Rose::DB

Published in: Technology
1 Comment
0 Likes
Statistics
Notes
  • Иван, респект и уважуха тебе. Спасибо за материал.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

No Downloads
Views
Total views
1,116
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
5
Comments
1
Likes
0
Embeds 0
No embeds

No notes for slide

Catalyst and Rose::DB

  1. 1. Catalyst and Rose::DB сборка
  2. 2. Rose::DB <ul><li>Описание работы с ORM смотри </li></ul><ul><li>здесь </li></ul>
  3. 3. Rose::DB (+) <ul><li>Значительно быстрее, чем DBIx::Class </li></ul><ul><li>Проще в формировании запросов </li></ul><ul><li>Не так «страшен», как DBIx::Class , для переходящих с DBI </li></ul><ul><li>И … пожалуй всё. </li></ul>
  4. 4. Rose::DB (-) <ul><li>Пересоздание классов таблиц затрёт все добавленные программистом методы (в отличие от DBIx::Class ). Что актуально при изменении структуры базы. </li></ul><ul><li>get_ имяТаблицы _iterator может упасть по Out of memory, если возвращает действительно много строк. </li></ul><ul><li>При переходе по отношению между таблицами (например один-ко-многим), вы не можете конкретизировать запрос. Вам вернутся все строки. Имхо, DBIx::Class в этом смысле менее избыточен. </li></ul>
  5. 5. Прикручиваем к Catalyst <ul><li>Допустим, вы правильно раскурили мануалы по Rose::DB , и всё ещё хотите прикрутить именно этот ORM к вашему приложению. Ну что ж… тогда мы идём к Вам. </li></ul><ul><li>Будем считать, что у Вас уже развёрнуто cat- приложение и оно называется MList . </li></ul>
  6. 6. Прикручиваем к Catalyst <ul><li>Приблизительная структура папок Вашего проекта: </li></ul>View/ Model/ Controller/ MList/ lib/ MList/ any_path/ /
  7. 7. Прикручиваем к Catalyst <ul><li>Нам потребуются 2 модуля. В одном из них ( RDB.pm ) будет описан коннект, во втором ( RDBBase .pm) – подключение. </li></ul><ul><li>Итак, создаём RDB.pm по пути /any_path/MList/lib/MList/Model : </li></ul><ul><li>package MList::Model::RDB; </li></ul><ul><li>use warnings; </li></ul><ul><li>use strict; </li></ul><ul><li>use base qw(Rose::DB); </li></ul><ul><li>__PACKAGE__->use_private_registry; </li></ul><ul><li>__PACKAGE__->register_db( </li></ul><ul><li>driver => 'mysql', </li></ul><ul><li>type => 'main', </li></ul><ul><li>database => ‘basename', </li></ul><ul><li>host => ‘db_host', </li></ul><ul><li>username => ‘user', </li></ul><ul><li>password => ‘password', </li></ul><ul><li>connect_options => </li></ul><ul><li>{ </li></ul><ul><li>AutoCommit => 1, </li></ul><ul><li>RaiseError => 1, </li></ul><ul><li>} </li></ul><ul><li>); </li></ul><ul><li>1; </li></ul>
  8. 8. Прикручиваем к Catalyst <ul><li>Создаём модель RDBBase </li></ul><ul><li>$ cd /any_path/MList </li></ul><ul><li>$ script/mlist_create.pl model RDBBase </li></ul><ul><li>*создание модуля через script/mlist_create.pl нужно, чтобы у вас автоматически создались тесты для Модели в папке t/ . </li></ul><ul><li>И отредактируем полученную модель до вида: </li></ul><ul><li>package MList::Model::RDBBase; </li></ul><ul><li>use strict; </li></ul><ul><li>use MList::Model::RDB; </li></ul><ul><li>use Rose::DB::Object; </li></ul><ul><li>our @ISA = qw(Rose::DB::Object); </li></ul><ul><li>use parent 'Catalyst::Model'; </li></ul><ul><li># вот так корректно подключается helper в вашем cat- приложении для Rose::DB </li></ul><ul><li>use Rose::DB::Object::Helpers qw(load_or_insert load_speculative); </li></ul><ul><li>sub init_db {MList::Model::RDB->new(type => 'main')} </li></ul><ul><li># метод для доступа к классу Manager вашей таблицы </li></ul><ul><li>sub custom_rdb_manager {$_[0].'::Manager'} </li></ul><ul><li>1; </li></ul>
  9. 9. Прикручиваем к Catalyst <ul><li>Итого у вас получилось следующее: </li></ul>RDB.pm RDBBase.pm View/ Model/ Controller/ MList/ lib/ MList/ any_path/ /
  10. 10. Прикручиваем к Catalyst <ul><li>Теперь создаём скрипт, который выльет нам структуру базы в классы Rose::DB::Object , используя созданные RDB.pm и RDBBase.pm . </li></ul><ul><li>#!/usr/bin/perl </li></ul><ul><li>use warnings; </li></ul><ul><li>use strict; </li></ul><ul><li>use Rose::DB::Object::Loader; </li></ul><ul><li>use lib ' /any_path/MList/lib '; </li></ul><ul><li>use MList::Model::RDB; </li></ul><ul><li>use MList::Model::RDBBase; </li></ul><ul><li>my $loader = Rose::DB::Object::Loader->new( </li></ul><ul><ul><li>db => MList::Model::RDB->new(type => 'main'), </li></ul></ul><ul><ul><li>class_prefix => 'MList::Model::RDB', </li></ul></ul><ul><ul><li>base_classes => 'MList::Model::RDBBase', </li></ul></ul><ul><ul><li>with_foreign_keys => 1, </li></ul></ul><ul><ul><li>with_relationships => 1 </li></ul></ul><ul><li>); </li></ul><ul><li>$loader->make_modules( </li></ul><ul><ul><li>module_dir=>' /any_path/MList/lib ', </li></ul></ul><ul><ul><li>exclude_tables=>'Tmp' </li></ul></ul><ul><li>); </li></ul><ul><li>exit; </li></ul>
  11. 11. Прикручиваем к Catalyst <ul><li>use lib – позволяет подгрузить созданные модули. </li></ul><ul><li>make_modules – этот метод выльет структуру таблиц, при этом, параметр exclude_tables => ‘Tmp’ исключит из обработки таблицы. Соотвествующие regexp /^Tmp/ </li></ul><ul><li>Для ознакомления с другими параметрами. Вы можете ознакомиться с Rose::DB::Object::Loader . </li></ul><ul><li>Итак, после запуска скрипта, по пути /any_path/MList/lib/MList/Model/RDB вы можете увидеть все созданные классы. </li></ul><ul><li>Всегда помните, что это – не DBIx::Class , и если у вас уже были созданые по этому пути классы таблиц, то Rose::DB::Object::Loader просто перезапишет их . </li></ul>
  12. 12. Использование <ul><li>Допустим у вас в базе была таблица ml_persons . Тогда для неё будут созданы 2 модуля: </li></ul><ul><li>/any_path/MList/lib/MList/Model/RDB/MlPerson . pm </li></ul><ul><li>Этот модуль отвечает за выборку строк из таблицы. Обращение к нему: </li></ul><ul><li>$c->model(‘RDB::MlPerson’) - >any_method( … ) </li></ul><ul><li>, где any_method – это методы Rose::DB::Object </li></ul><ul><li>/any_path/MList/lib/MList/Model/RDB/MlPerson/Manager . pm </li></ul><ul><li>Этот модуль отвечает за обработку набора строк из таблицы. Обращение к нему: </li></ul><ul><li>$c->model(‘RDB::MlPerson::Manager’) - >any_method( … ) </li></ul><ul><li>, где any_method – это методы Rose::DB::Object ::Manager </li></ul>
  13. 13. Использование <ul><li>Итого у вас получилось следующее: </li></ul>Manager.pm MlPerson.pm MlPerson/ … RDB.pm RDBBase.pm RDB/ View/ Model/ Controller/ MList/ lib/ MList/ any_path/ /
  14. 14. Использование <ul><li>И, напоследок, вспомним про необязательный метод: </li></ul><ul><li>sub custom_rdb_manager {$_[0].'::Manager'} </li></ul><ul><li>из модуля RDBBase .pm . </li></ul><ul><li>Он позволяет вам делать вот такие обращения: </li></ul><ul><li>$c->model(‘RDB::MlPerson’) - > custom_rdb_manager- >any_method( … ) </li></ul><ul><li>, где any_method – это методы Rose::DB::Object ::Manager </li></ul><ul><li>Здесь важно, чтобы название метода (которое вы дадите) просто не совпадало с названием ни одного поля в базе. </li></ul><ul><li>Но, данный метод опционален и, вы всегда можете обращаться к классам ::Manager так, как было показано на предыдущем слайде. </li></ul>

×