Your SlideShare is downloading. ×
0
Predefを使ったsqlのトレース
Predefを使ったsqlのトレース
Predefを使ったsqlのトレース
Predefを使ったsqlのトレース
Predefを使ったsqlのトレース
Predefを使ったsqlのトレース
Predefを使ったsqlのトレース
Predefを使ったsqlのトレース
Predefを使ったsqlのトレース
Predefを使ったsqlのトレース
Predefを使ったsqlのトレース
Predefを使ったsqlのトレース
Predefを使ったsqlのトレース
Predefを使ったsqlのトレース
Predefを使ったsqlのトレース
Predefを使ったsqlのトレース
Predefを使ったsqlのトレース
Predefを使ったsqlのトレース
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Predefを使ったsqlのトレース

233

Published on

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

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

Published in: Software
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
233
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×