我有一个包含多个现有表的遗留数据库,我想在一个遗留表中查询数千条记录没有主键
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参数,并且不需要表中的主键。
答案 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>