逆引きDjangoORM: ORMで生成されるSQLを確認したい
要件
手順
code:settings.py
"loggers": {
"django.db.backends": {
"level": "DEBUG", # デフォルトはERRORのみログ出力
"propagate": False,
},
SQLが実行されたタイミングでログが出力される
SQLの内容を読んで次の組み替えプランを考えられる
ORMがいつSQL実行しているかの把握に役立つ
2. sqlparseによる出力を整える
code:python
import sqlparse
def p(query):
print(sqlparse.format(str(query), reindent=True))
ログ出力ではSQLがフォーマットされておらず読みづらいため、整形して出力する関数を用意しておく
3. ORMからSQL文を取り出してsqlparseで確認する
QuerySetオブジェクトから取得
code:python
queryset = Person.objects.all()
p(queryset.query)
Prefetchから取得
code:python
bool(queryset) # クエリとprefetchを実行しキャッシュさせる
p(queryset._prefetch_related_lookups0.queryset.query) タグ