你如何 运行 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
因为我要从实体化视图中提取数千条记录 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