読者です 読者をやめる 読者になる 読者になる

実行しているSQLを確認する

Django

 DjangoのORMがどんなSQLを実行しているか、ずっと気になっていたのですが、ようやく、トレースを表示する方法が分かりました。
 settings.pyで

  1. DEBUGをTrueにする
  2. INTERNAL_IPSにデバッグ・コンテクスト・プロセッサを有効にするアドレスを設定
  3. コンテクスト・プロセッサにdjango.core.context_processors.debugを追加

 これでOK。具体的には、settings.pyに次のように記述します。

# settings.py
DEBUG = True

INTERNAL_IPS = ('127.0.0.1', )

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.debug',
)


 後は、テンプレートの適当な場所に、

{{ sql_queries }}

 という、テンプレート変数を追加すると、実行したSQLと実行時間が出力されます。


 ただし、RequestContextを渡すのをわすれないようにしなくてはなりません。django.shortcuts.render_to_responseを使っているならば、次のように書きます。

from djagno.shortcuts import render_to_response
from django.template import RequestContext

def some_view_method(request):
    return render_to_response('mytemplate.html', {},
         context_instance=RequestContext(request))


 この方法だと、SQL実行後にリダイレクトさせるような場合は、出力結果を確認する事ができないので、もっと別の方法を考える必要がありそうです。HTTPResponseより、sys.stdoutに出力させたいなー。


 出力を確認してみて思ったのは、やっぱりDjangoのセッションは重いということ(DBにセッションを保存するのはコストが高い!もちろん、そのコストに見合う場合ケースもありますが)、DjangoのContentTypeモデルとGenericForeignKey&GenericRelationは・・・、うーん、ということですね。


 GenericForeignKey&GenericRelationは、僕が今まで抱いていたDBの常識を超越しているので、非常に悩ましい存在なのですが、少しは判断材料が増えたのは良かったと思っています。これらに関しては、また別途。