Мне кажется, что у меня уроки лося - это какая-то боль. Затем использовать DBIx :: Class чтобы получить набор результатов ... затем вручную сопоставить мой набор результатов с классами лосей.
Есть ли простой способ сопоставить результаты DBIx :: Class с моими пользовательскими классами Moose?
Ответы (3)
Если вам нужно выполнять сопоставление между классами Moose и схемой DBIC, вы можете посмотреть на постоянное хранилище объектов, например KiokuDB.
Вы теряете некоторые функции реляционной базы данных, особенно если у вас есть существующая схема, но вы получаете множество функций, главной из которых является незаметное сопоставление между хранилищем данных и вашей объектной моделью. Серверная часть DBI для KiokuDB, вероятно, лучший пример такого компромисса. База данных сильно ненормализована, но это потому, что она эффективно работает как хранилище ключей.
Однако KiokuDB может работать с механизмами хранения, оптимизированными для этого типа данных. Он поддерживает некоторых из нынешнего поколения знаменитостей «NoSQL», включая CouchDB и MongoDB. Он также поддерживает более старый любимый фанатами BerkelyDB.
Kioku - не решение всех проблем, но он довольно успешно используется для парковочной мобильности, чтобы беспрепятственно обрабатывать все хранилища данных. .
Вы можете без проблем использовать 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;
Похоже, вы описываете именно то, что я недавно написал, чтобы сопоставить значения атрибутов Moose с Rose :: DB :: Object (при этом объект db и объектный менеджер содержатся в частных атрибутах) и наоборот. Первоначально я использовал триггеры вокруг каждого атрибута Moose для немедленной записи в объект Rose, но позже отказался от этого подхода и лениво записывал значения только при необходимости (то есть во время операции ->save()
). Я реализовал это, используя несколько ролей и сахарный класс, который автоматически установил свойство атрибута, указывающее «Я - поле таблицы» для соответствующих атрибутов.
Но не делайте того, что сделал я - просто используйте DBIx :: Class напрямую. ! Как я слышал, следующая основная версия все равно будет переписана на Moose.