ActiveRecord,Postgres和分区表

时间:2010-11-23 22:09:01

标签: ruby-on-rails postgresql partitioning

我根据pg docs here:在我们的pg 8.3数据库中建立了一个基于触发器的分区方案。基本上,我有一个父表,以及几个子表。父对象上的插入触发器将父对象上的任何插入重定向到相应的子表中 - 这很有效。

然而,ActiveRecord pg适配器似乎依赖于postgres INSERT ... RETURNING“id”扩展来获取初始插入后返回行的id。但是触发器似乎打破了RETURNING子句 - 虽然正确创建了行,但没有返回id。

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

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

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

欢迎任何其他建议。 Thanx - m