Rails - 批处理sql查询 - 主键不包含在自定义选择子句中

时间:2016-02-19 08:44:09

标签: ruby-on-rails activerecord

我有一个包含多个现有表的遗留数据库,我想在一个遗留表中查询数千条记录没有主键

   LegacyTable.where(condition, start_date, end_date).find_each do |record|
      yield record
    end

但它会抛出以下错误:

ORA-01741: illegal zero-length identifier

因为它会自动生成order by "LegacyTable"."" 根据{{​​3}}

  

注意:无法设置订单。在主键(“id ASC”)上自动设置为升序,以使批量订购工作。这也意味着此方法仅适用于基于整数的主键。

然后我在模型中设置self.primary_key = 'TRANSACTION_ID',但TRANSACTION_ID只是旧表中的索引。然后它引发了另一个例外:

RuntimeError (Primary key not included in the custom select clause):

如何在rails中进行批量查询?如果使用Java,我只需添加fetchSize参数,并且不需要表中的主键。

2 个答案:

答案 0 :(得分:1)

而不是使用Legacy.where(意思是不使用ORM,它试图将每一行映射到模型记录),建议只使用它作为数据库的连接器并执行Legacy.find_by_sql <之类的查询/ p>

答案 1 :(得分:0)

ActiveRecord的find_in_batches(基于find_each)依靠主键排序在多个查询(details)中执行批量提取。正如 @aliibrahim 所述,您必须自己实现分页。

虽然我知道问题是关于Oracle的,但值得一提的是来自Google的其他人,对于使用PostgreSQL的人来说,有一个很好的解决方案:postgresql_cursor gem。

  

PostgreSQL游标是ActiveRecord PostgreSQLAdapter的扩展,适用于非常大的结果集。它提供了一个游标打开/获取/关闭接口来访问数据,而无需将所有行加载到内存中,而是以“块”(默认为1_000行)加载结果行,对其进行缓冲,然后一次返回一行。 / p>