Rails Postgres。在加载数据之前删除索引,然后重新添加它们......整齐

时间:2017-11-08 12:49:42

标签: ruby-on-rails postgresql

我们有一个导入过程,涉及将XML文件中的数据加载到我们的rails应用程序的数据库表中。我们从表中删除索引,然后在加载完成后重新添加它们。这似乎是加速加载过程的建议(对我们来说似乎是必要的)。但这样做有什么好的整洁方法,避免了邪恶的重复?我们当前的方法感觉......有点聪明,但同时又非常hacky:

我们有6个不同的数据库表,它们共定义了42个不同的索引。这些都是在Rails迁移和schema.rb中定义的,我们希望能够对这些进行更改,避免在其他地方复制模式定义所以......

当前方法

在进入加载逻辑之前,我们有一点黑魔法:

indexdefs = []
import_tables.each do |table_name|
  res = @conn.exec("SELECT indexname, indexdef FROM pg_indexes WHERE tablename='#{table_name}'");
  res.each do |row|
    indexdefs << row['indexdef']
    @conn.exec("DROP index #{row['indexname']}")
  end
end
logger.info "#{indexdefs.size} indexes dropped"

然后我们将数据加载到表中(需要很长时间),然后......

indexdefs.each do |indexdef|
  logger.info "Re-adding index: #{indexdef}"
  @conn.exec(indexdef)
end

如上所述,我们用此实现的关键是,没有明确重复任何有关索引定义/模式的知识。我们查询pg_indexes(Postgres内部模式表)以获取索引定义的详细信息,因为它们是通过迁移设置的,然后我们存储SQL CREATE语句的字符串数组indexdefs,我们晚点跑。

......太好了,但还是那么糟糕。

这样做有什么好办法?也许我应该使用的框架/宝石,或完全不同的问题方法。

0 个答案:

没有答案