上我的 Moose 课似乎有点痛苦。然后使用DBIx::Class获取结果集..然后手动将我的结果集映射到 moose 类。
3 回答
如果您必须在 Moose 类和 DBIC 模式之间来回映射,您可能希望查看像KiokuDB这样的持久对象存储。
你失去了关系数据库的一些特性,特别是如果你有一个现有的模式,但你获得了很多特性,主要是数据存储和对象模型之间的安静映射。KiokuDB 的 DBI 后端可能是这种权衡的最好例子。该数据库是高度非规范化的,但那是因为它作为一个有效的密钥库工作。
然而,KiokuDB 可以使用针对此类数据进行了优化的存储引擎。它支持当前的一些“NoSQL”名人,包括 CouchDB 和 MongoDB。它还支持老粉丝最喜欢的 BerkelyDB。
Kioku 并不是所有问题的解决方案,但它非常成功地用于Parking Mobility无缝处理所有数据存储。
您可以使用带 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 属性值映射到Rose::DB::Object值(私有属性中包含 db 对象和 objectmanager)而写的内容,反之亦然。我最初在每个 Moose 属性周围使用触发器来立即写入 Rose 对象,但后来放弃了这种方法并仅在需要时(即在->save()
操作时)懒惰地写入值。我使用几个角色和一个糖类来实现它,它自动安装了一个属性特征,指示相关属性的“我是一个表字段”。
但是不要做我所做的——直接使用DBIx::Class!无论如何,下一个主要版本正在用 Moose 重写,所以我听说了。