【问题标题】:How do you run ActiveRecord `find_each` to a materialized view in postgres你如何在 postgres 中运行 ActiveRecord `find_each` 到物化视图
【发布时间】:2015-05-16 07:11:54
【问题描述】:

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

但是,当我运行以下命令时:

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

我收到以下错误:

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

经过研究,我发现您无法在没有主键的表上运行 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 列。如果我有的话,我听说它可能会被活动记录识别为默认主键,但我还没有测试过。

【问题讨论】:

    标签: postgresql rails-activerecord materialized-views


    【解决方案1】:

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

    比如:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      相关资源
      最近更新 更多