动态地将列添加到DBIx :: Class ResultSet

时间:2010-12-03 17:12:49

标签: perl dbix-class

我有一个代表eBay拍卖的DBIx::Class对象。基础表有一个描述列,其中包含大量数据。几乎从不使用description列,因此它不包含在该表的DBIx::Class列列表中。这样,大多数查询都不会获取拍卖描述数据。

但是,我确实有一个需要此列的脚本。在这种情况下,我想像访问任何其他列一样访问description列的内容:

$auction->description

如何在不强制所有其他查询获取描述列的情况下完成此操作?

1 个答案:

答案 0 :(得分:3)

DBIx::Class的旧版本中(不确定版本号),以下内容曾经起作用:

my $rs = $schema->resultset('Auctions');
my $lots = $rs->search(
   undef,
   { '+select' => 'description', '+as' => 'description' },
);

这似乎不适用于DBIx::Class的现代版本下的行更新。尝试使用更新

$auction->update({ description => '...'})
DBIx::Class 0.08123下的

给出了以下错误:“DBIx :: Class :: Relationship :: CascadeActions :: update():在...处没有这样的列描述”

假设需要额外列的脚本在其自己的进程中运行。你可以这样做:

my $rs = $schema->resultset('Auctions');
$rs->result_source->add_columns('description');
YourApp::Schema::Lots->add_columns('description');
YourApp::Schema::Lots->register_column('description');

当然,这是全球变化。添加列后,同一进程中的其他代码将开始在查询中提取description列。更不用说,它有点难看。