gpt4 book ai didi

ruby - 是否有任何使用游标或智能提取的 Ruby ORM?

转载 作者:数据小太阳 更新时间:2023-10-29 06:31:27 27 4
gpt4 key购买 nike

我正在寻找一个 Ruby ORM 来替代 ActiveRecord。我一直在研究 Sequel 和 DataMapper。它们看起来很不错,但是它们似乎都没有做基本的事情:在不需要时不将所有内容加载到内存中。

我的意思是我已经在 ActiveRecord 和 Sequel 上尝试了以下(或等效的)在有很多行的表上:

 posts.each { |p| puts p }

他们俩都为内存疯狂。他们似乎将所有内容都加载到内存中,而不是在需要时获取内容。我在 ActiveRecord 中使用了 find_in_batches,但这不是一个可接受的解决方案:

  1. ActiveRecord 不是一个可以接受的解决方案,因为我们在使用它时遇到了太多问题。
  2. 为什么我的代码应该知道分页机制?我很乐意在某处配置页面大小,仅此而已。使用 find_in_batches,您需要执行以下操作:

    post.find_in_batches { |批处理| batch.each {|p|把 p } }

但这应该是透明的。

那么有没有可靠的 Ruby ORM 可以正确地进行提取?


更新:

正如 Sergio 所提到的,在 Rails 3 中,您可以使用 find_each,这正是我想要的。然而,由于 ActiveRecord 不是一个选项,除非有人真的可以说服我使用它,问题是:

  1. 哪些 ORM 支持 find_each 的等效项?
  2. 怎么做?
  3. 为什么我们需要 find_each,而 find 应该这样做,不是吗?

最佳答案

Sequel 的 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

对于分页扩展,您不能真正做到这一点,但您可以将其包装在一种使其大部分透明的方法中。

关于ruby - 是否有任何使用游标或智能提取的 Ruby ORM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8849340/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com