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?

577voto

geowa4 Punkte 38662

Siehe FAQ der Dokumente: " Wie kann ich die rohen SQL-Abfragen sehen, die Django ausführt? "

django.db.connection.queries enthält eine Liste der SQL-Abfragen:

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

Querysets haben auch eine query Attribut die die auszuführende Abfrage enthält:

print(MyModel.objects.filter(name="my name").query)

Beachten Sie, dass die Ausgabe der Abfrage kein gültiges SQL ist, weil:

"Django interpoliert die Parameter nie: Es sendet die Abfrage und die Parameter separat an den Datenbankadapter, der die entsprechenden Operationen durchführt."

Aus dem Django-Fehlerbericht #17741 .

Aus diesem Grund sollten Sie Abfrageausgaben nicht direkt an eine Datenbank senden.

Wenn Sie die Abfragen zurücksetzen müssen, um z. B. zu sehen, wie viele Abfragen in einem bestimmten Zeitraum laufen, können Sie reset_queries de django.db :

from django.db import reset_queries

reset_queries()
print(connection.queries)
>>> []

119voto

Patrick Z Punkte 1861

Django-Erweiterungen ein Kommando haben Muschel_plus mit einem Parameter print-sql

./manage.py shell_plus --print-sql

In der django-shell werden alle ausgeführten Abfragen ausgegeben

Ex.:

User.objects.get(pk=1)
SELECT "auth_user"."id",
       "auth_user"."password",
       "auth_user"."last_login",
       "auth_user"."is_superuser",
       "auth_user"."username",
       "auth_user"."first_name",
       "auth_user"."last_name",
       "auth_user"."email",
       "auth_user"."is_staff",
       "auth_user"."is_active",
       "auth_user"."date_joined"
FROM "auth_user"
WHERE "auth_user"."id" = 1

Execution time: 0.002466s [Database: default]

<User: username>

71voto

Glader Punkte 2207

Werfen Sie einen Blick auf debug_toolbar ist es sehr nützlich für die Fehlersuche.

Dokumentation und Quelle finden Sie unter http://django-debug-toolbar.readthedocs.io/ .

Screenshot of debug toolbar

42voto

jgabrielsk8 Punkte 361

Die Abfrage ist eigentlich in die API der Modelle eingebettet:

q = Query.objects.values('val1','val2','val_etc')

print(q.query)

36voto

Bryce Punkte 7795

Keine andere Antwort deckt diese Methode ab, also:

Die bei weitem nützlichste, einfachste und zuverlässigste Methode ist es, Ihre Datenbank zu befragen. Zum Beispiel unter Linux für Postgres könnten Sie tun:

sudo su postgres
tail -f /var/log/postgresql/postgresql-8.4-main.log

Jede Datenbank hat ein etwas anderes Verfahren. In den Datenbankprotokollen sehen Sie nicht nur das rohe SQL, sondern auch jeden Verbindungsaufbau oder Transaktions-Overhead, den Django dem System aufbürdet.

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