199 Stimmen

Wie kann man die entsprechende SQL-Abfrage des Django ORM's queryset anzeigen?

Gibt es eine Möglichkeit, wie ich die Abfrage der Django ORM generiert drucken kann?

Angenommen, ich führe die folgende Anweisung aus: Model.objects.filter(name='test')

Wie kann ich die generierte SQL-Abfrage sehen?

232voto

Joe Holloway Punkte 26743

Jedes QuerySet-Objekt hat eine query Attribut, das Sie zu Debugging-Zwecken protokollieren oder nach stdout ausgeben können.

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

Beachten Sie, dass in pdb die Verwendung von p qs.query wird nicht wie gewünscht funktionieren, aber print(qs.query) lo hará.

Wenn das nicht funktioniert, versuchen Sie es bei alten Django-Versionen:

print str(qs.query)

Editar

Ich habe auch benutzerdefinierte Vorlagen-Tags verwendet (wie in dieser Ausschnitt ), um die Abfragen im Rahmen einer einzelnen Anfrage als HTML-Kommentare einzubringen.

7 Stimmen

Wie sieht es mit Abfragen für .save() aus?

0 Stimmen

@DataGreed Gute Frage, es könnte sich lohnen, sie in einem neuen Thread zu stellen, damit Sie mehr Antworten erhalten.

5 Stimmen

Funktioniert es mit prefetch_related d.h. 2 Abfragen anzeigen? Ich sehe nur 1.

128voto

aisbaa Punkte 8654

Sie können auch Python Logging verwenden, um alle von Django generierten Abfragen zu protokollieren. Fügen Sie dies einfach zu Ihrer Einstellungsdatei hinzu.

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

Eine andere Methode für den Fall, dass die Anwendung eine HTML-Ausgabe erzeugt - django debug toolbar verwendet werden können.

3 Stimmen

Wenn jemand etwas haben möchte Zusammenfassung mit Summenbildung de Anzahl der ausgeführten Abfragen außerdem Gesamtzeit Es hat gedauert: dabapps.com/blog/logging-sql-abfragen-django-13

11 Stimmen

Bei mir hat es nicht funktioniert, ich musste Folgendes hinzufügen 'level': 'DEBUG' unter 'django.db' .

117voto

Pramod Punkte 4990

Sie können diesen Code in Ihre Shell einfügen, um alle SQL-Abfragen anzuzeigen:

# 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())

80voto

Daniel Roseman Punkte 565786

Mientras DEBUG ist eingeschaltet:

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

Für eine individuelle Abfrage können Sie dies tun:

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

29voto

Mikhail Korobov Punkte 21059

Vielleicht sollten Sie einen Blick werfen auf django-debug-toolbar Anwendung werden alle Abfragen für Sie protokolliert, es werden Profilinformationen dazu angezeigt und vieles mehr.

4 Stimmen

Dies ist sehr nützlich, aber es funktioniert nur in der GUI und manchmal möchte man Abfrageprotokolle direkt im ORM sehen. z.B. haben Sie eine API, ohne GUI!

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