有没有一种简单的方法将DBIx :: Class结果映射到我的自定义Moose类?

时间:2010-02-18 19:47:58

标签: perl moose dbix-class

拥有我的Moose课程似乎很痛苦。然后使用DBIx::Class获取结果集..然后手动将我的结果集映射到moose类。

3 个答案:

答案 0 :(得分:6)

如果您必须在Moose类和DBIC模式之间来回映射,您可能希望查看像KiokuDB这样的持久对象存储。

你失去了关系数据库的一些功能,特别是如果你有一个现有的模式,但是你获得了很多功能,主要是在数据存储和你的对象模型之间进行静默映射。 KiokuDB的DBI后端可能就是这种权衡的最好例子。数据库被高度去规范化,但那是因为它有效地作为密钥库。

然而,KiokuDB可以使用针对此类数据进行优化的存储引擎。它支持当前几种“NoSQL”名人,包括CouchDB和MongoDB。它还支持老粉丝最喜欢的BerkelyDB。

Kioku不是每个问题的答案,但Parking Mobility非常成功地使用它来无缝处理所有数据存储。

答案 1 :(得分:3)

你可以使用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;

答案 2 :(得分:1)

听起来您正在准确描述我最近编写的内容,以便将Moose属性值映射到Rose::DB::Object值(db对象和objectmanager包含在私有属性中),反之亦然。我最初使用每个Moose属性周围的触发器立即写入Rose对象,但后来放弃了这种方法并且仅在需要时(即在->save()操作时)懒惰地写入值。我使用一些角色和一个糖类实现了它,它自动安装了一个属性特征,表明相关属性的“我是一个表字段”。

但是不要做我做的事 - 直接使用DBIx::Class!无论如何,下一个主要版本将在Moose中重写,所以我听到了。