Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Predefを使ったsqlのトレース

5,983 views

Published on

Module#prependのショートカット、Predefを使ってデバッグや、アプリケーションで使用されるSQLの解析に役立てるほう法を紹介します。

Published in: Software
  • Be the first to comment

Predefを使ったsqlのトレース

  1. 1. Predefを使ったSQLのトレース 山本悠滋 2015-06-04 表参道.rb #1
  2. 2. こんにちは! 山本悠滋(@igrep) 26歳♂ Eightのサーバーサイド担当です。 最近はCoffeeScriptでクライアントをよく触ります。 Haskellの勉強会を毎月やっとります。
  3. 3. 小さな小さなgemを作りました predefと言います
  4. 4. 小さな小さなgemを作りました 使ったことある人ー ( ^ω^)ノ
  5. 5. 小さな小さなgemを作りました リリースまだですけどwww => しました! predef
  6. 6. なにするgem? 「Module#prependしてdefするgem」略して「predef」 ただのModule#prependのショートカット
  7. 7. なにするgem? 例えば... class SomeExternalClass def method_you_know(*args) ... end end ↑みたいな(外部のライブラリなど、直接触りづらい)クラ スがあったとして
  8. 8. なにするgem? 例えば... Predef.predef SomeExternalClass, :method_you_know do|*args| p args super(*args) end ↑みたいにすると 対象のメソッドの前後に好きな処理を加えられちゃう♪ この場合、引数を出力する処理を加えちゃう♪
  9. 9. なにするgem? やってることは実質これ↓と同じ module Wrapper def method_you_know *args p args super(*args) end end class SomeExternalClass prepend Wrapper end 詳しくはprependでググってください。
  10. 10. なにするgem? 余計なmoduleを定義しなくて済む ただそれだけなんで別に無理に使う必要もない
  11. 11. 事例 アプリ上で発行されうる全てのSQLと、その場所を把握した い ActiveRecord任せのためどこでどんなクエリを発行するか 分かりにくくなりがち ただし、SELECT・DELETE・UPDATEのみ。 INSERTやその他DDLなどはテストでだけ実行されるケース が多い。 あと、要件上あまり関心がなかった。
  12. 12. 事例 アプリ上で発行されうる全てのSQLと、その場所を把握した い Mysql2::Client#queryメソッドをラップした上で、全テスト を実行 最終的にActiveRecordが実行するはずなので、漏れがない ラップしたqueryメソッドで受け取った引数と、バックトレース をログに出す カバレッジもとり、カバーできてない分のみコードを読む
  13. 13. 事例 アプリ上で発行されうる全てのSQLと、その場所を把握した い こんな感じ... Predef.predef Mysql2::Client, :query do|sql| if sql =~ /SELECT|UPDATE|DELETE/ puts sql pp caller end super(sql) # 引数を忘れずに end
  14. 14. 事例 アプリ上で発行されうる全てのSQLと、その場所を把握した い で、こんな感じの出力が! SELECT * from your_apps_table WHERE ... ["/path/to/your_app/app/models/foo.rb:355:in `some_method_in_model'", ...]
  15. 15. Tips Refinementsも用意してます 使い方 using Predef::Refinements Mysql2::Client.predef :query do|sql| ... end
  16. 16. まとめ(みなさん向け) $ gem install predef
  17. 17. まとめ(みなさん向け) require 'predef' using Predef::Refinements Mysql2::Client.predef :query do|sql| puts sql if sql =~ /.../ super(sql) end
  18. 18. まとめ(私向け) さっさと bundle exec rake release しなさい。 こちらも終了: predef

×