ActiveRecord経由でMySQLのプロシジャーを実行

| Comments

世の中、綺麗事では生きていけません。

Railsを使ったからといって、既存の資産を無視しては生きられない事が多い
世知辛い世の中です。

今回はプロシジャーをRails3から利用する必要があったので
ActiveRecordから、接続を頂いて・・・( ´∀`)bグッ!
と、機能を追加しました。

1
2
3
4
5
class ActiveRecord::Base
  def self.use_connection( &block )
    block.call(self.connection)
  end
end

メソッドを追加して、ホイホイっと実行してみましたが。。。
一応動くのですが、一度プロシジャーを実行すると他のクエリーが実行出来なくなってしまいます。

1
2
3
Mysql2::Error: Commands out of sync; you can't run this command now: call dummyProc();
ActiveRecord::StatementInvalid: Mysql2::Error: Commands out of sync; you can't run this command now: call dummyProc();
from /home/okuno/workspace/QRapi/vendor/bundler/ruby/1.9.1/gems/activerecord-3.2.9/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:

もう、駄目ぽ  

 
 
 
 
 
 

で、対応

どうやら、プロシジャーの場合は問い合わせの終了が終わってない扱いになってしまっている、と思われます。
このメソッドでは、ブロックを抜けたらクエリーは終了(という前提)で、以下の様にして対応しました。

1
2
3
4
5
6
7
8
9
class ActiveRecord::Base
  def self.use_connection( &block )
    begin
      block.call(self.connection)
    ensure
      self.connection.reconnect! unless connection.active?
    end
  end
end

どやぁ!( ̄ー ̄)
と、したい所ですが、下記のサイトを参考にさせて頂きました。m(__)m
参考にさせて頂いたページ

Comments