Django ORM が生成しているクエリを印刷する方法はありますか?
次のステートメントを実行するとします。Model.objects.filter(name='test')
生成された SQL クエリを表示するにはどうすればよいですか?
Django ORM が生成しているクエリを印刷する方法はありますか?
次のステートメントを実行するとします。Model.objects.filter(name='test')
生成された SQL クエリを表示するにはどうすればよいですか?
各 QuerySet オブジェクトには、query
デバッグ目的で stdout に記録または出力できる属性があります。
qs = Model.objects.filter(name='test')
print(qs.query)
pdb では、 usingp qs.query
は期待どおりに機能しないことに注意してくださいprint(qs.query)
。
それでもうまくいかない場合は、古い Django バージョンの場合、次を試してください。
print str(qs.query)
編集
また、カスタム テンプレート タグ (このスニペットで概説されているように) を使用して、クエリを単一のリクエストのスコープに HTML コメントとして挿入しました。
Python ロギングを使用して、Django によって生成されたすべてのクエリをログに記録することもできます。これを設定ファイルに追加するだけです。
LOGGING = {
'disable_existing_loggers': False,
'version': 1,
'handlers': {
'console': {
# logging handler that outputs log messages to terminal
'class': 'logging.StreamHandler',
'level': 'DEBUG', # message level to be written to console
},
},
'loggers': {
'': {
# this sets root level logger to log debug and higher level
# logs to console. All other loggers inherit settings from
# root level logger.
'handlers': ['console'],
'level': 'DEBUG',
'propagate': False, # this tells logger to send logging message
# to its parent (will send if set to True)
},
'django.db': {
# django also has database level logging
'level': 'DEBUG'
},
},
}
アプリケーションが html 出力を生成している場合の別の方法 - django デバッグ ツールバーを使用できます。
このコードをシェルに貼り付けると、すべての SQL クエリが表示されます。
# To get all sql queries sent by Django from py shell
import logging
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())
がオンである限りDEBUG
:
from django.db import connection
print(connection.queries)
個々のクエリに対して、次のことができます。
print(Model.objects.filter(name='test').query)
アプリケーションを見てみるとdjango-debug-toolbar
、すべてのクエリがログに記録され、それらのプロファイリング情報が表示されます。
堅牢なソリューションは、データベース サーバーのログをファイルに記録してから、
tail -f /path/to/the/log/file.log