我正在使用DBIx::Class::ResultSet来查询项目并对我的数据进行分页。这是我使用的查询:
my $clients = $c->model('DB::User')->search(
{ active_yn => 'y', client_yn => 'y' },
{
columns => [qw/id first_name last_name username email/],
order_by => ['last_name'],
page => ($c->req->param('page') || 1),
rows => 20,
}
);
有一次,我得到了结果集,我在Template::Toolkit中循环遍历结果:
[% WHILE (client = clients.next) %]
<tr>
<td>[% client.first_name %] [% client.last_name %]</td>
</tr>
[% END %]
我的问题是,每次拨打next
时都会发出新查询吗?我不清楚,因为all方法说它返回集合中的所有元素,所以第一个查询不这样做吗?我想尽可能高效。谢谢!
答案 0 :(得分:2)
答案是否定的:只要您使用相同的结果集实例,每次调用next
时都不会执行新查询。它旨在成为迭代记录的快捷方式。
答案 1 :(得分:0)
搜索返回标量中的ResultSet对象和列表上下文中的Result对象列表。 您可以使用search_rs强制返回ResultSet。
如果数据库支持游标,则下一步将使用游标,但每次调用只获取一行并从中构造Result对象。
如果行数较少,则执行单个SQL查询并一次构建所有Result对象会更快。 分页时通常就是这种情况。
当构造所有Results对象的内存量太大时,例如导出数百万行时,下一步是有意义的。