酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

Arproxy ActiveRecordが発行したSQLを加工できるGem

cookpad/arproxy - GitHub』は、 Arproxy ActiveRecordが発行したSQLを加工できるGemです。 Slow Queryを調査したり、SQLにコメントを付与したり、SQLをReadonlyに制限したりできます!


Gemインストール

Gemfileに以下を追加して、bundle installを実行。

1
2
3
4
5
# Gemfile
group :development do
  # ActiveRecordのSQLを加工
  gem 'arproxy'
end

SQLをログに出力

以下のようになSQLを実行する部分をProxyします。

1
2
3
+-------------------------+                       +------------------+
| ActiveRecord::Base#find |--execute(sql, name)-->| Database Adapter |
+-------------------------+                       +------------------+

SQLをログに出力するサンプルはこちら。

1
2
3
4
5
6
7
8
9
10
11
12
13
class QueryTracer < Arproxy::Base
  def execute(sql, name=nil)
    Rails.logger.debug sql
    Rails.logger.debug caller(1).join("\n")
    super(sql, name)
  end
end

Arproxy.configure do |config|
  config.adapter = "mysql2" # A DB Apdapter name which is used in your database.yml
  config.use QueryTracer
end
Arproxy.enable!

Slow Queryのログを出力

Slow Queryのログを出力する場合はこちら。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class SlowQueryLogger < Arproxy::Base
  def initialize(slow_ms)
    @slow_ms = slow_ms
  end

  def execute(sql, name=nil)
    result = nil
    ms = Benchmark.ms { result = super(sql, name) }
    if ms >= @slow_ms
      Rails.logger.info "Slow(#{ms.to_i}ms): #{sql}"
    end
    result
  end
end

Arproxy.configure do |config|
  config.use SlowQueryLogger, 1000
end

SQLにコメントを差し込む

SQLにコメントを差し込む場合はこちら。

1
2
3
4
5
6
class CommentAdder < Arproxy::Base
  def execute(sql, name=nil)
    sql += " /*this_is_comment*/"
    super(sql, name)
  end
end

これは面白いかも!

おすすめの書籍