我们有一个导入过程,涉及将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
,我们晚点跑。
......太好了,但还是那么糟糕。
这样做有什么好办法?也许我应该使用的框架/宝石,或完全不同的问题方法。