IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

Ruby & Rails

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第6回 Arproxy ~簡単にDBアクセス時の処理をフック~ (松永紘) 2013年8月

 RubyKaigi2013の開催から約一か月後の6月25日、Rails4の正式版がリリースされました。約3年ぶりのメジャーアップデートとなりますが、Rails2から3へのそれと比べると劇的な変化は感じづらいかもしれません(*1)。それでもStrong Parameters(*2)やTurbolinks(*3)などの機能追加やさまざまな改善が行われていますので、ぜひ使ってみてください。
 また7月23日には、Rails3.2系の最新安定版であるRails3.2.14がリリースされています(*4)。150を超えるバグフィックスや機能改修が行われていますので、Rails3.2系を使い続ける場合は3.2.14にバージョンアップすることをお勧めします(*5)。

 さて今回は、Arproxy(*6)というライブラリをご紹介いたします。
 RailsのActiveRecordはとても強力なORMですが、ActiveRecordに処理を委譲した後の挙動を変えたい場合には物凄く手間がかかります。例えば、発行されたSQLに手を入れたり、DBアクセスの直前や直後に処理を付け加えたりといったケースが挙げられるでしょう。
 Arproxyを使うと、下図のようにActiveRecordとDB Adapterとの間で処理をフックすることができます。

fig01

 ここでは、booksテーブルへINSERT・UPDATE・DELETEのいずれかのSQLが発行された際、例外を発生させる処理を例にしてご説明いたします(*7)。

fig02

 なお、動作環境はRuby1.9.3、Rails3.2.14、DB AdapterはMysql2で確認しています(*8)。

 まずはインストールをしましょう。「/Gemfile」に以下を記載して「bundle install」を実行します。

gem 'arproxy'

 次に処理内容を定義します。Arproxy::Baseを継承したクラスを作成し、その中でexecuteメソッドをオーバライドします。

class CheckQueryForBooksTable < Arproxy::Base
  def execute(sql, name = nil)
    if sql =~ /¥`books¥`/ && sql =~ /^(INSERT|UPDATE|DELETE)¥b/
      raise "books readonly. : #{sql}"
    else
      super(sql, name)
    end
  end
end

 executeメソッドの第一引数sqlにActiveRecordで発行されたSQLが渡されます。ここでは、正規表現を用いてSQLを調査し問題なければsuperでDB Adapterへ処理を委譲しています。
 ちなみに、第二引数nameにはSQLの処理名称が渡されます。

fig03

 最後にArpoxyを有効にします。「config/initializers」内のスクリプトファイルに以下のコードを記述します。

Arproxy.configure do |config|
  config.adapter = "mysql2"   // DB Adapterの指定
  config.use CheckQueryForBooksTable   // 先ほど定義したクラスをuse
end

Arproxy.enable!

 そこまで終わりましたら動作確認をしてみましょう。Booksテーブルに対してINSERT・UPDATE・DELETEのいずれかを発行する処理を行うとエラー画面が表示されるはずです。

fig04

 以上、簡単ではありましたがArproxyの使用例をご説明いたしました。
 上記の例以外にも、Github上にあるArproxyのページ(*6)ではスロークエリの監視などより実践的な例が載っていますので一読されることをお勧めします。

 Arproxyは既存のソースコードに手を入れることなくDBへのアクセスまわりの挙動を変えることができます。運用時や開発時はもちろん、個人的には教育的な側面でも使えるのではないかなあと考えています。発想次第でいろいろと面白いことができそうなライブラリですのでぜひお試しください。

 それでは、Enjoy Ruby!

注釈

*1:その分Rails3から4へのバージョンアップはそれほど大変ではないようです。

*2https://github.com/rails/strong_parameters

*3https://github.com/rails/turbolinks/

*4http://weblog.rubyonrails.org/2013/7/23/Rails-3-2-14-has-been-released/

*5:Rails3.2系は、次のリリース(3.2.15)をもってバグフィックスを終了します。以降はセキュリティフィックスしか行われませんので注意が必要です。

*6https://github.com/cookpad/arproxy

*7:実際に動かしてみる場合は、テーブルの名前を適宜読み替えるかscaffoldなどでbooksテーブル作成して試してみてください。

*8:執筆時点(version 0.1.3)ではSQLiteやPostgreSQLでの動作確認が取れませんでした。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes