你如何 运行 ActiveRecord `find_each` 到 postgres 中的物化视图

How do you run ActiveRecord `find_each` to a materialized view in postgres

因为我要从实体化视图中提取数千条记录 Matview,我想使用 find_each 将其分成批次以释放内存。

但是,当我运行以下内容时:

Matview.where('p_id > 100').find_each {|m| m }

我得到以下错误:

PG::SyntaxError: ERROR:  zero-length delimited identifier at or near """"

经过研究,我发现如果没有主键,您无法在 table 上 运行 find_each

我尝试使用以下方法将唯一 ID 添加到 Matview

CREATE UNIQUE INDEX index_mv ON matview(p_id)

虽然成功了,但并没有替代主键。

我尝试使用以下方法向我的实体化视图添加主要约束:

ALTER MATERIALIZED matview ADD CONSTRAINT mv_pk primary key (p_id) disabled

但是失败了。

所以一般来说,我的问题是,我如何 运行 find_each 在实体化视图上,也许具体来说,我如何将主键添加到实体化视图,以便我可以 运行 find_each?

编辑:为清楚起见,我在 Matview 中没有 id 列。如果我有的话,我听说它可能会被活动记录识别为默认主键,但我没有测试过。

ActiveRecord不关心它是否真的是数据库中的主键,但你需要使用primary_key=方法在你的对象上设置primary_key字段.

所以像这样:

class Matview < ActiveRecord::Base
    self.table_name = 'MATERIALIZED_VIEW_NAME_HERE'
    self.primary_key = 'ID_COLUMN_NAME_HERE'
end