177

Django ORM が生成しているクエリを印刷する方法はありますか?

次のステートメントを実行するとします。Model.objects.filter(name='test')

生成された SQL クエリを表示するにはどうすればよいですか?

4

8 に答える 8

206

各 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 コメントとして挿入しました。

于 2009-06-09T18:22:45.710 に答える
120

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 デバッグ ツールバーを使用できます。

于 2012-07-07T09:05:23.970 に答える
114

このコードをシェルに貼り付けると、すべての 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())
于 2012-10-28T04:07:57.060 に答える
76

がオンである限りDEBUG:

from django.db import connection
print(connection.queries)

個々のクエリに対して、次のことができます。

print(Model.objects.filter(name='test').query)
于 2009-06-09T18:23:26.613 に答える
30

アプリケーションを見てみるとdjango-debug-toolbar、すべてのクエリがログに記録され、それらのプロファイリング情報が表示されます。

于 2009-06-09T18:36:25.937 に答える
3

堅牢なソリューションは、データベース サーバーのログをファイルに記録してから、

tail -f /path/to/the/log/file.log
于 2014-02-20T18:23:32.507 に答える