QuerySet.queryで手軽にSQLを確認する

DjangoSQLを確認する方法として一番手軽だなと思ったのが.queryを利用したSQL出力でした。

以下のようにQuerySetに対して.queryと記述することで実行される予定のSQLを確認することが出来ます。

python manage.py shell

>>> from snippets.models import Snippet
>>> queryset = Snippet.objects.all()
>>> print(queryset.query)
SELECT "snippets"."id", "snippets"."title", "snippets"."code", "snippets"."description", "snippets"."created_by_id", "snippets"."created_at", "snippets"."updated_at" FROM "snippets"

queryについて

そこでどういうものかちゃんと理解してみようとリファレンスを見たみたところ、public APIではないとのこと。

自分の中では「あくまでもDjangoの公開された機能ではないよ」と解釈しています。

リファレンスには以下のように説明されていました。

The query parameter to QuerySet exists so that specialized query subclasses can reconstruct internal query state. The value of the parameter is an opaque representation of that query state and is not part of a public API.

https://docs.djangoproject.com/en/5.0/ref/models/querysets/#queryset-api

では他にはどうする方法があるのか

所属企業であるビープラウドの書籍、自走プログラマーでは

  • Django Debug Toolbar
  • setting.LOGGING

に記述する、という方法が挙げられていました。 詳しくは以下を参照ください。

https://jisou-programmer.beproud.jp/DjangoORM%E3%81%A8%E3%81%AE%E4%BB%98%E3%81%8D%E5%90%88%E3%81%84%E6%96%B9/60-Django_ORM%E3%81%A7%E3%81%A9%E3%82%93%E3%81%AASQL%E3%81%8C%E7%99%BA%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E6%B0%97%E3%81%AB%E3%81%97%E3%82%88%E3%81%86.html

冒頭で.queryについて触れてみたものの、public APIでは無いこともあり、それだけではなく、EXPLAINの結果や実行速度なども一緒に調べることが出来るので、Django Debug Toolbarが導入されていたらそちらで確認する方が個人的にも楽かな、と思います。

本当にちょっと発行されるSQLが見たい程度であれば、.queryを利用してみる、くらいが良いのかなと思いました。