逆引きDjangoORM: ORMで生成されるSQLを確認したい
要件
Django ORMを組み替えながら、生成されるSQLを確認したい
手順
1. Djangoのdjango.db.backendsのログ出力を有効化する
code:settings.py
"loggers": {
"django.db.backends": {
"handlers": ...,
"level": "DEBUG", # デフォルトはERRORのみログ出力
"propagate": False,
},
参考: https://docs.djangoproject.com/en/4.0/ref/logging/#django-db-backends
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)
https://github.com/django/django/blob/3.2.13/django/db/models/query.py#L283-L284
タグ
SQL
Django
逆引きDjangoORM