Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何在Class::DBI中进行更新而不首先选择记录?_Perl_Class Dbi - Fatal编程技术网

Perl 如何在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

要使用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, ...};
$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。