Сиквел 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
, он выполняет отдельные запросы, поэтому вам следует быть осторожным, если есть одновременные изменения в наборе данных, который вы извлекаете.
Причина, по которой это не значение по умолчанию в сиквеле, вероятно, та же самая причина, по которой это не значение по умолчанию в ActiveRecord, а именно то, что в общем случае это не очень хорошее значение по умолчанию. Только запросы с большими результирующими наборами действительно должны беспокоиться об этом, и большинство запросов не возвращают большие результирующие наборы.
По крайней мере, с поддержкой курсора адаптера Postgres, довольно просто сделать его по умолчанию для вашей модели:
Post.dataset = Post.dataset.use_cursor
Для расширения нумерации страниц вы не можете этого сделать, но вы можете обернуть его таким способом, который сделает его в основном прозрачным.