466 Stimmen

Wie kann ich die rohen SQL-Abfragen sehen, die Django ausführt?

Gibt es eine Möglichkeit, die SQL, die Django ausgeführt wird, während der Durchführung einer Abfrage zu zeigen?

26voto

clichedmoog Punkte 105

Dies ist eine sehr späte Antwort, aber für die anderen, die durch die Suche hierher gekommen sind.

Ich möchte eine Protokollierungsmethode einführen, die sehr einfach ist; fügen Sie django.db.backends logger in settins.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',
        },
    },
}

Ich verwende auch eine Umgebungsvariable, um das Niveau einzustellen. Wenn ich also die SQL-Abfragen sehen möchte, setze ich einfach die Umgebungsvariable, und das Debug-Protokoll zeigt die tatsächlichen Abfragen an.

18voto

googletorp Punkte 32775

Obwohl Sie es mit dem mitgelieferten Code tun können, finde ich, dass die Debug-Symbolleisten-App ein großartiges Werkzeug ist, um Abfragen anzuzeigen. Sie können es von github herunterladen aquí .

Damit haben Sie die Möglichkeit, alle auf einer bestimmten Seite durchgeführten Abfragen zusammen mit der für die Abfrage benötigten Zeit anzuzeigen. Außerdem wird die Anzahl der Abfragen auf einer Seite zusammen mit der Gesamtzeit für einen schnellen Überblick zusammengefasst. Dies ist ein großartiges Tool, wenn Sie sich ansehen wollen, was der Django ORM hinter den Kulissen tut. Es hat auch eine Menge anderer netter Funktionen, die Sie verwenden können, wenn Sie möchten.

18voto

Overclocked Punkte 1167

Eine weitere Option, siehe Logging-Optionen in settings.py, beschrieben in diesem Beitrag

http://dabapps.com/blog/logging-sql-queries-django-13/

debug_toolbar verlangsamt jeden Seitenladevorgang auf Ihrem Entwicklungsserver, Logging nicht, also ist es schneller. Die Ausgaben können auf die Konsole oder in eine Datei ausgegeben werden, so dass die Benutzeroberfläche nicht so schön ist. Aber bei Ansichten mit vielen SQLs kann es sehr lange dauern, die SQLs mit debug_toolbar zu debuggen und zu optimieren, da jeder Seitenaufbau so langsam ist.

12voto

rabbit.aaron Punkte 2191

Zu diesem Zweck habe ich eine Erweiterung entwickelt, mit der Sie ganz einfach einen Dekorator auf Ihre Ansichtsfunktion setzen können und sehen können, wie viele Abfragen ausgeführt werden.

Zum Installieren:

$ pip install django-print-sql

Zur Verwendung als Kontextmanager:

from django_print_sql import print_sql

# set `count_only` to `True` will print the number of executed SQL statements only
with print_sql(count_only=False):

  # write the code you want to analyze in here,
  # e.g. some complex foreign key lookup,
  # or analyzing a DRF serializer's performance

  for user in User.objects.all()[:10]:
      user.groups.first()

Zur Verwendung als Dekorateur:

from django_print_sql import print_sql_decorator

@print_sql_decorator(count_only=False)  # this works on class-based views as well
def get(request):
    # your view code here

Github: https://github.com/rabbit-aaron/django-print-sql

12voto

robert wallace Punkte 189

Nur um hinzuzufügen, in django, wenn Sie eine Abfrage wie haben:

MyModel.objects.all()

tun:

MyModel.objects.all().query.sql_with_params()

oder:

str(MyModel.objects.all().query)

um den Sql-String zu erhalten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X