【问题标题】:Is there an easy way to map DBIx::Class results to my custom Moose classes?有没有一种简单的方法可以将 DBIx::Class 结果映射到我的自定义 Moose 类?
【发布时间】:2010-02-19 08:11:36
【问题描述】:

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

【问题讨论】:

  • 为什么要将结果映射到 Moose 类?为什么不直接使用 DBIx::Class 类?

标签: perl moose dbix-class


【解决方案1】:

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

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

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

Kioku 并不是所有问题的解决方案,但它非常成功地用于 Parking Mobility 无缝处理所有数据存储。

【讨论】:

    【解决方案2】:

    您可以使用带有 DBIC 的 Moose 没问题。实际上我喜欢使用 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 属性(即 DBIx::Class 读取模式,而不是由您在上面执行的方法调用定义) ?
    • 你的意思是 runtime 模式加载?不会玩的好。 :)
    【解决方案3】:

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

    但是不要像我做的那样——直接使用DBIx::Class!无论如何,下一个主要版本正在用 Moose 重写,所以我听说了。

    【讨论】:

    • 无论如何,下一个主要版本正在用 Moose 重写,所以我听说了。 这已经持续了很多年。
    • Matt 上个月在 Perl Oasis 上进行了一次富有创意的演讲。
    猜你喜欢
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 2011-08-24
    相关资源
    最近更新 更多