DBIx :: Class :: ResultSet每次迭代项目新查询

时间:2013-06-06 17:38:05

标签: perl catalyst dbix-class

我正在使用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方法说它返回集合中的所有元素,所以第一个查询不这样做吗?我想尽可能高效。谢谢!

2 个答案:

答案 0 :(得分:2)

答案是否定的:只要您使用相同的结果集实例,每次调用next时都不会执行新查询。它旨在成为迭代记录的快捷方式。

答案 1 :(得分:0)

搜索返回标量中的ResultSet对象和列表上下文中的Result对象列表。 您可以使用search_rs强制返回ResultSet。

如果数据库支持游标,则下一步将使用游标,但每次调用只获取一行并从中构造Result对象。

如果行数较少,则执行单个SQL查询并一次构建所有Result对象会更快。 分页时通常就是这种情况。

当构造所有Results对象的内存量太大时,例如导出数百万行时,下一步是有意义的。