Ce diaporama a bien été signalé.
Le téléchargement de votre SlideShare est en cours. ×

Predefを使ったsqlのトレース

Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Chargement dans…3
×

Consultez-les par la suite

1 sur 18 Publicité

Predefを使ったsqlのトレース

Télécharger pour lire hors ligne

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

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

Publicité
Publicité

Plus De Contenu Connexe

Diaporamas pour vous (20)

Similaire à Predefを使ったsqlのトレース (20)

Publicité

Plus récents (20)

Publicité

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

×