【问题标题】:ActiveRecord, Postgres and partitioned tablesActiveRecord、Postgres 和分区表
【发布时间】:2010-11-23 22:09:00
【问题描述】:

根据 pg 文档 here:,我已经在我们的 pg 8.3 数据库之一上设置了基于触发器的分区方案。基本上,我有一个父表,还有几个子表。父级上的插入触发器将父级上的任何插入重定向到适当的子表中——这很好用。

然而,ActiveRecord pg 适配器似乎依赖 postgres INSERT ... RETURNING "id" 扩展来获取初始插入后返回行的 id。但触发器似乎破坏了 RETURNING 子句——尽管行创建正确,但没有返回 id。

虽然我认为这种行为是有道理的——毕竟,主表中没有插入任何内容,但我确实需要找到某种解决方法,因为将插入其他需要行 ID 的子记录刚刚插入的行。

我想我可以在插入之前向行添加某种唯一 id,然后在插入之后使用此键重新读取它,但这看起来很笨拙。有没有人有更好的解决方法?

【问题讨论】:

    标签: ruby-on-rails postgresql partitioning


    【解决方案1】:

    从 Rails v.2.2.1 开始,您可以通过覆盖 PostgreSQLAdapter 中的 #supports_insert_with_returning 方法来关闭“返回 id”行为。

    class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
      def supports_insert_with_returning?
        false
      end
    end
    

    【讨论】:

      【解决方案2】:

      目前看来,我最好的选择是在 before_create 事件中更改表前缀,以便插入直接发生在底层分区表上,完全绕过插入触发器。然而,这不是一个完美的解决方案,但似乎是性能最高且最简单的解决方案。

      我能想到的唯一其他解决方案是在每个表中添加一个 guid 列,并在插入后立即通过 guid 从分区表中重新读取该行以获取 id。

      欢迎提出其他建议。谢谢——m

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多