续集的Dataset#each
确实一次会生成单独的行,但大多数数据库驱动程序会首先将整个结果加载到内存中。
如果您使用Sequel的Postgres适配器,您可以选择使用真实游标:
posts.use_cursor.each{|p| puts p}
默认情况下,一次提取 1000 行,但您可以使用一个选项来指定每次游标提取要抓取的行数:
posts.use_cursor(:rows_per_fetch=>100).each{|p| puts p}
如果您不使用 Sequel 的 Postgres 适配器,则可以使用 Sequel 的分页扩展:
Sequel.extension :pagination
posts.order(:id).each_page(1000){|ds| ds.each{|p| puts p}}
然而,就像 ActiveRecord 的find_in_batches
/find_each
,这会执行单独的查询,因此如果您正在检索的数据集存在并发修改,您需要小心。
这不是 Sequel 中的默认值的原因可能与它不是 ActiveRecord 中的默认值的原因相同,即在一般情况下它不是一个好的默认值。只有具有大型结果集的查询才真正需要担心它,并且大多数查询不会返回大型结果集。
至少有了 Postgres 适配器光标支持,可以很容易地将其设为模型的默认值:
Post.dataset = Post.dataset.use_cursor
对于分页扩展,您实际上不能这样做,但您可以将其包装在使其基本上透明的方法中。