Есть ли простой способ сопоставить результаты DBIx :: Class с моими пользовательскими классами Moose?

Мне кажется, что у меня уроки лося - это какая-то боль. Затем использовать DBIx :: Class чтобы получить набор результатов ... затем вручную сопоставить мой набор результатов с классами лосей.


person mike park    schedule 18.02.2010    source источник
comment
Почему вы сопоставляете результаты с классами Moose? Почему бы не использовать классы DBIx :: Class напрямую?   -  person friedo    schedule 18.02.2010


Ответы (3)


Если вам нужно выполнять сопоставление между классами Moose и схемой DBIC, вы можете посмотреть на постоянное хранилище объектов, например KiokuDB.

Вы теряете некоторые функции реляционной базы данных, особенно если у вас есть существующая схема, но вы получаете множество функций, главной из которых является незаметное сопоставление между хранилищем данных и вашей объектной моделью. Серверная часть DBI для KiokuDB, вероятно, лучший пример такого компромисса. База данных сильно ненормализована, но это потому, что она эффективно работает как хранилище ключей.

Однако KiokuDB может работать с механизмами хранения, оптимизированными для этого типа данных. Он поддерживает некоторых из нынешнего поколения знаменитостей «NoSQL», включая CouchDB и MongoDB. Он также поддерживает более старый любимый фанатами BerkelyDB.

Kioku - не решение всех проблем, но он довольно успешно используется для парковочной мобильности, чтобы беспрепятственно обрабатывать все хранилища данных. .

person perigrin    schedule 19.02.2010

Вы можете без проблем использовать Moose с DBIC. На самом деле мне нравится использовать MooseX :: Declare, поскольку я считаю, что расширенный синтаксис очень полезен при разработке надежных общедоступных API, например:

use MooseX::Declare;
class MyApp::Schema::Result::Geo::Division
 extends MyApp::Schema::Result {
    use Locale::Geocode::Division;
 __PACKAGE__->table('division');
 __PACKAGE__->add_columns(
  fk_territory_id => {
   data_type => 'char',
   size => '36',
  },
  division_id => {
   data_type => 'char',
   size => '36',
  },
  code => {
            data_type => 'varchar',
   size => '5',
  },
     created => {
   data_type => 'datetime',
   set_on_create => 1,
  },
 );

 __PACKAGE__->set_primary_key('fk_territory_id','division_id');
 __PACKAGE__->uuid_columns('division_id');
    __PACKAGE__->add_unique_constraint(['fk_territory_id','code']);

 __PACKAGE__->belongs_to(
  territory => 'MyApp::Schema::Result::Geo::Territory',
  {'foreign.territory_id' => 'self.fk_territory_id'},
 );
    method as_geocode_division {
        Locale::Geocode::Division->new($self->code);
    }     
 __PACKAGE__->meta->make_immutable(inline_constructor => 0);
} 1;
person user276468    schedule 18.02.2010
comment
Как бы вы объявили атрибуты Moose, если схема уже определена в БД (то есть DBIx :: Class читает в схеме, а не определяется вызовами методов, которые вы выполняете выше)? - person Ether; 18.02.2010
comment
Вы имеете в виду загрузку схемы runtime? Не буду вести себя хорошо. :) - person hobbs; 19.02.2010

Похоже, вы описываете именно то, что я недавно написал, чтобы сопоставить значения атрибутов Moose с Rose :: DB :: Object (при этом объект db и объектный менеджер содержатся в частных атрибутах) и наоборот. Первоначально я использовал триггеры вокруг каждого атрибута Moose для немедленной записи в объект Rose, но позже отказался от этого подхода и лениво записывал значения только при необходимости (то есть во время операции ->save()). Я реализовал это, используя несколько ролей и сахарный класс, который автоматически установил свойство атрибута, указывающее «Я - поле таблицы» для соответствующих атрибутов.

Но не делайте того, что сделал я - просто используйте DBIx :: Class напрямую. ! Как я слышал, следующая основная версия все равно будет переписана на Moose.

person Ether    schedule 18.02.2010
comment
Следующая мажорная версия все равно переписывается на Moose, насколько я знаю. это происходит уже много лет. - person Evan Carroll; 19.02.2010
comment
Мэтт изобретательно рассказал об этом в Perl Oasis в прошлом месяце. - person perigrin; 19.02.2010