2017-01-10 72 views
1

我在執行復雜的數據導入任務,使用多個 PostgreSQL數據庫連接。在某些情況下,如果遇到ActiveRecord::StatementInvalid異常,我需要在特定的數據庫連接上執行回滾。我可以從ActiveRecord :: StatementInvalid異常中獲取ActiveRecord :: Connection實例嗎?

我似乎無法得到該例外的ActiveRecord::Connection實例。我能得到的是一個PG::Connection實例,從exception.cause.connection。不幸的是,我需要ActiveRecord實例來正確執行回滾,並保持內部AR數據結構與數據庫同步。至少我需要最後一個保存點的名稱(如果有)來執行手動回滾。

如何從ActiveRecord::StatementInvalid異常中獲得ActiveRecord::Connection實例?

+0

您正在使用多個客戶或你是如何連接之間通過客戶機區別? – Anthony

+0

只有一個客戶端,但模型類上有多個連接,即「MyModel.establish_connection」和「MyModel.remove_connection」 –

回答

0

如果有人需要這個,我在這裏發佈我的解決方案。

實質上,我只是通過搜索所有池中的所有連接來強制執行它,並檢查低層連接是否與我的連接匹配。

def ar_connection_from_pg_connection(pg_conn) 
    ActiveRecord::Base.connection_handler.connection_pools.each do |pool| 
    conn = pool.connections.find { |ar| ar.raw_connection == pg_conn } 
    return conn if conn 
    end 
    nil 
end 
相關問題