Django ORMのクエリセットの対応するSQLクエリを表示するにはどうすればよいですか?


164

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

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

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

回答:


178

各QuerySetオブジェクトには、queryデバッグのためにstdoutに記録または出力できる属性があります。

qs = Model.objects.filter(name='test')
print qs.query

編集する

また、カスタムスニペットタグ(このスニペットで概説)を使用して、単一のリクエストのスコープにクエリをHTMLコメントとして挿入しました。


6
.save()のクエリはどうですか?
DataGreed 2010

@DataGreed良い質問です。より多くの応答を得るために、新しいスレッドで質問する価値があるかもしれません。
Joe Holloway

4
それはで動作しないprefetch_related、すなわち2つのクエリを示して?1のみが表示されます
ユーザーの

動作しません。わかりました<django.db.models.sql.query.Query object
ドパトラマン

print(str(qs.query))を試してください。10年で内部が少し変わったと思います
Joe Holloway

114

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
        },
    },
}

アプリケーションがhtml出力を生成している場合の別の方法- -djangoデバッグツールバーを使用できます。


3
誰かが持っているしたい場合sumupで要約をする実行されるクエリの数だけでなく、合計時間はかかりました:dabapps.com/blog/logging-sql-queries-django-13
andilabs

9
それは私が追加する必要がありました、私のために動作しませんでした'level': 'DEBUG''django.db'
rvernica 2016年

108

このコードをシェルに貼り付けると、すべての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())


30

多分あなたはdjango-debug-toolbarアプリケーションを見てみるべきです、それはあなたのためにすべてのクエリをログに記録し、それらのためのプロファイリング情報を表示します。


3
これは非常に便利ですが、GUIでのみ機能し、クエリログをORMで直接確認したい場合があります。たとえば、GUIのない​​APIがあります。
2016

3

堅牢なソリューションは、データベースサーバーにファイルへのログを記録させることです。

tail -f /path/to/the/log/file.log

2

データベースルーティングを使用している場合、おそらく複数のデータベース接続があります。このようなコードを使用すると、セッションの接続を確認できます。単一の接続の場合と同じ方法で統計をリセットできます。reset_queries()

from django.db import connections,connection,reset_queries
...
reset_queries()  # resets data collection, call whenever it makes sense

...

def query_all():
    for c in connections.all():
        print(f"Queries per connection: Database: {c.settings_dict['NAME']} {c.queries}")

# and if you just want to count the number of queries
def query_count_all()->int:
    return sum(len(c.queries) for c in connections.all() )

1

Django debug_toolbarを使用して、SQLクエリを表示できます。debug_toolbarの使用方法のステップバイステップガイド:

Debug_toolbarをインストールします

pip install django-debug-toolbar

settings.pyファイルを編集して、インストールされているアプリにdebug_toolbarを追加します。これは、下の「django.contrib.staticfiles」に追加する必要があります。また、ミドルウェアにdebug_toolbarを追加します。

Settings.py =>

INSTALLED_APPS= [ 'debug_toolbar'] 

MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']

settings.pyファイルにINTERNAL_IPSという名前の新しいリストを作成します

Settings.py => settings.pyファイルの最後に新しいリストを作成し、リストの下に追加します。

INTERNAL_IPS= [127.0.0.1']

これにより、デバッグを内部開発サーバーでのみ実行できます

#Projectのurls.pyファイルを編集し、コードの下に追加します。

if settings.DEBUG:
    import debug_toolbar
    urlpatterns = [
    url(r'^__debug__/', include(debug_toolbar.urls))       
    ] + urlpatterns

移行を適用してサーバーを再度実行する

127.0.0.1のWebページにアドオンが表示されます。[SQLクエリ]チェックボックスをクリックすると、クエリの実行時間も実際に確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.