Perl 如何在Class::DBI中进行更新而不首先选择记录?
要使用Class::DBI执行插入,只需执行以下操作:Perl 如何在Class::DBI中进行更新而不首先选择记录?,perl,class-dbi,Perl,Class Dbi,要使用Class::DBI执行插入,只需执行以下操作: my $object = Object::DB->insert({ a => 1, b => 2, c => 3, ...}); 但是没有这样的东西可以更新。我能想到的最好办法是先选择记录,然后再更新它: my $object = Object::DB->retrieve($id); my $object->set( a => 1, b => 2, c => 3, ...}; $obj
my $object = Object::DB->insert({ a => 1, b => 2, c => 3, ...});
但是没有这样的东西可以更新。我能想到的最好办法是先选择记录,然后再更新它:
my $object = Object::DB->retrieve($id);
my $object->set( a => 1, b => 2, c => 3, ...};
$object->update;
这是没有效率的,因为我必须先进行选择,然后进行更新,而不是只进行一次更新
使用Class::DBI有更好的方法吗?我不想做42$object->a(1),$object->b(2)等等,$object->update 据我所知,Class::DBI没有很好的方法来实现这一点,正如您所注意到的,它的
update()
方法旨在对以前从数据库加载的对象进行调用
但是,您可以通过以下方式说服Class::DBI做您想做的事情:
# Make new "empty" object
my $o = My::CDBI::Object->new;
# Set the primary key column and discard the change
$o->set(your_pk_column => 123);
$o->discard_changes;
# Set your other columns
$o->set(a => 'foo', b => 'bar');
# Do the update
$o->update;
my $collection = Object::DB->search_where({id => {'>=', 0}});
foreach my $obj ($collection->next()) {
$obj->a('bob');
$obj->b('tom');
}
$collection->update();
如果这个特性对您来说很重要,并且您还没有深入到项目中,那么您肯定会更幸运地使用一种较新的Perl ORM,例如或。DBIx::Class甚至包括。我发现的一种方法是覆盖对象的默认迭代器类。这允许您使用集合上的更新方法拥有单个对象的集合。DBI为此提供了一个方法:
__PACKAGE__->iterator_class('MyClass::CDBI::Iterator');
这允许您在迭代器类中创建一个update
方法,该方法可以保存集合中的所有对象。因此,您的代码可能如下所示:
# Make new "empty" object
my $o = My::CDBI::Object->new;
# Set the primary key column and discard the change
$o->set(your_pk_column => 123);
$o->discard_changes;
# Set your other columns
$o->set(a => 'foo', b => 'bar');
# Do the update
$o->update;
my $collection = Object::DB->search_where({id => {'>=', 0}});
foreach my $obj ($collection->next()) {
$obj->a('bob');
$obj->b('tom');
}
$collection->update();
这就产生了一些非常好的自我记录代码。如果你这样做,我还建议在update()发生时使用
is\u changed
方法。它将通过不更新未更改的行来帮助您节省时间。DBIx::Class使这变得简单。你真的应该考虑远离CDBI。