jpa*_*dvo 9 ruby-on-rails rails-migrations
我想为生产数据库添加索引.幸运的是我们正在运行Postgres,它很好地允许并发索引,因此我们可以添加一个没有停机时间的索引.无法从事务中添加catch - 并发索引,并且rails迁移会将事务中的所有内容包装起来.
幸运的是,有些东西看起来像一个非常简单的解决方案:覆盖ActiveRecord :: Migration私有方法ddl_transaction,如此处所述.
class IndexUsersEmails < ActiveRecord::Migration
def ddl_transaction(&block)
block.call # do not start a transaction
end
def self.up
execute "CREATE INDEX CONCURRENTLY index_users_on_email ON users(email)"
end
end
Run Code Online (Sandbox Code Playgroud)
问题是它似乎在Rails 3.1中不起作用.我完全按照Gist中的代码执行操作,并且rails似乎完全忽略它.关于去哪里的任何想法?
jpa*_*dvo 11
我只是注意到我从未在这里接受过答案,所以我应该说我做了什么.结果你可以像这样退出交易:
class AddFbPageIdIndexToTabs < ActiveRecord::Migration
def up
execute "END"
execute "CREATE INDEX CONCURRENTLY bob_lob_law_index ON bob_lob (law)"
execute "BEGIN"
end
def down
execute "END"
execute "DROP INDEX CONCURRENTLY bob_lob_law_index"
execute "BEGIN"
end
end
Run Code Online (Sandbox Code Playgroud)
只需execute "END"在要在事务外部运行的事物之前运行.这将结束ActiveRecord :: Migration为迁移自动设置的事务.在完成要在事务外部运行的代码之后,execute "BEGIN"打开一个新事务,以便ActiveRecord :: Migration可以完成其清理过程并关闭它认为已打开的事务.
(我忘记了在网上我找到了这个技巧,现在找不到它.编辑欢迎来源!)
| 归档时间: |
|
| 查看次数: |
2484 次 |
| 最近记录: |