Gibt es eine Möglichkeit, dem SQL anzuzeigen, dass Django ausgeführt wird, während eine Abfrage ausgeführt wird?
307
Siehe die häufig gestellten Fragen zu Dokumenten: " Wie kann ich die unformatierten 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)
Abfragesätze haben auch ein query
Attribut, das 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 wirklich: Es sendet die Abfrage und die Parameter separat an den Datenbankadapter, der die entsprechenden Operationen ausführt."
Aus dem Django-Fehlerbericht # 17741 .
Aus diesem Grund sollten Sie keine Abfrageausgabe direkt an eine Datenbank senden.
str()
Funktion zu verwenden, die die interne__str__()
Methode aufruft . zBstr(MyModel.objects.filter(name="my name").query)
würde ich auch mit IPython und die Django - Shell Ihres Projekts empfehlen. Die Tab-Vervollständigung bietet dann eine Selbstbeobachtung des Objekts. Da Django für seine durchsetzungsfähigen Namensschemata bekannt ist, ist diese Methode in der Regel sehr nützlich.query
SQL nicht gültig ist, da "Django die Parameter nie tatsächlich interpoliert: Es sendet die Abfrage und die Parameter separat an den Datenbankadapter, der die entsprechenden Operationen ausführt." Quelle: code.djangoproject.com/ticket/17741stable
nicht verwendendev
, um auf die aktuelle Version von Django zu verlinken, wie folgtDjango-Erweiterungen haben einen Befehl shell_plus mit einem Parameter
print-sql
In der Django-Shell werden alle ausgeführten Abfragen gedruckt
Ex.:
quelle
Schauen Sie sich debug_toolbar an , es ist sehr nützlich für das Debuggen.
Dokumentation und Quelle finden Sie unter http://django-debug-toolbar.readthedocs.io/ .
quelle
quelle
m = MyModel.objects.get(...)
gefolgt vonm.query
m
es sich nicht mehr um ein Abfrageset handelt. Verwenden Sieq = MyModel.objects.filter(...)
dannq.query
, dannm = q.get()
.Keine andere Antwort behandelt diese Methode, also:
Ich finde die mit Abstand nützlichste, einfachste und zuverlässigste Methode, Ihre Datenbank zu fragen. Unter Linux für Postgres können Sie beispielsweise Folgendes tun:
Jede Datenbank hat ein etwas anderes Verfahren. In den Datenbankprotokollen sehen Sie nicht nur das unformatierte SQL, sondern auch alle Verbindungsaufbau- oder Transaktionskosten, die Django auf dem System platziert.
quelle
log_statement='all'
inpostgresql.conf
diesem Verfahren.postgresql.conf
indem Siepsql -U postgres -c 'SHOW config_file'
Obwohl Sie dies mit dem bereitgestellten Code tun können, finde ich, dass die Verwendung der Debug-Symbolleisten-App ein großartiges Werkzeug ist, um Abfragen anzuzeigen. Sie können es herunterladen von GitHub hier .
Auf diese Weise können Sie alle auf einer bestimmten Seite ausgeführten Abfragen zusammen mit der Zeit anzeigen, die für die Abfrage benötigt wurde. Außerdem wird die Anzahl der Abfragen auf einer Seite zusammen mit der Gesamtzeit für eine schnelle Überprüfung zusammengefasst. Dies ist ein großartiges Tool, wenn Sie einen Blick hinter die Kulissen des Django ORM werfen möchten. Es hat auch viele andere nette Funktionen, die Sie verwenden können, wenn Sie möchten.
quelle
Eine weitere Option finden Sie unter Protokollierungsoptionen in settings.py, die in diesem Beitrag beschrieben werden
http://dabapps.com/blog/logging-sql-queries-django-13/
debug_toolbar verlangsamt das Laden jeder Seite auf Ihrem Entwicklungsserver. Die Protokollierung erfolgt nicht, sodass sie schneller ist. Die Ausgaben können in eine Konsole oder eine Datei geschrieben werden, sodass die Benutzeroberfläche nicht so gut ist. Bei Ansichten mit vielen SQLs kann das Debuggen und Optimieren der SQLs über debug_toolbar jedoch lange dauern, da das Laden jeder Seite so langsam ist.
quelle
Wenn Sie sicherstellen, dass Ihre Datei settings.py Folgendes enthält:
django.core.context_processors.debug
aufgelistet inCONTEXT_PROCESSORS
DEBUG=True
IP
imINTERNAL_IPS
TupelDann sollten Sie Zugriff auf die
sql_queries
Variable haben. Ich füge jeder Seite, die so aussieht, eine Fußzeile hinzu:Ich habe die Variable
sql_time_sum
durch Hinzufügen der Zeile erhaltenzur Debug-Funktion in django_src / django / core / context_processors.py.
quelle
Zu diesem Zweck habe ich eine Erweiterung entwickelt, mit der Sie Ihre Ansichtsfunktion einfach mit einem Dekorator versehen und sehen können, wie viele Abfragen ausgeführt werden.
Installieren:
So verwenden Sie als Kontextmanager:
Als Dekorateur verwenden:
Github: https://github.com/rabbit-aaron/django-print-sql
quelle
Ich glaube, das sollte funktionieren, wenn Sie PostgreSQL verwenden:
quelle
Im Folgenden wird die Abfrage als gültiges SQL basierend auf https://code.djangoproject.com/ticket/17741 zurückgegeben :
quelle
Ich habe einen kleinen Ausschnitt erstellt, den Sie verwenden können:
Es wird als Parameterfunktion (enthält SQL-Abfragen) zum Überprüfen und Argumentieren verwendet, kwargs, die zum Aufrufen dieser Funktion benötigt werden. Als Ergebnis wird zurückgegeben, welche Funktion zurückgegeben wird, und SQL-Abfragen werden in einer Konsole gedruckt.
quelle
Ich habe diese Funktion in eine Util-Datei in einer der Apps in meinem Projekt eingefügt:
Dann importiere ich es bei Bedarf einfach und rufe es aus einem beliebigen Kontext (normalerweise einer Ansicht) auf, z. B.:
Es ist schön, dies außerhalb der Vorlage zu tun, denn wenn Sie API-Ansichten haben (normalerweise Django Rest Framework), ist dies auch dort anwendbar.
quelle
Für Django 2.2:
Da mir die meisten Antworten bei der Verwendung nicht viel geholfen haben
./manage.py shell
. Endlich habe ich die Antwort gefunden. Hoffe das hilft jemandem.So zeigen Sie alle Abfragen an:
So zeigen Sie die Abfrage für eine einzelne Abfrage an:
q.query
Ich zeige nur das Objekt für mich. Bei Verwendung der__str__()
(String-Darstellung) wird die vollständige Abfrage angezeigt.quelle
Anzeigen von Abfragen mit django.db.connection.queries
Greifen Sie auf eine unformatierte SQL-Abfrage für das QuerySet-Objekt zu
quelle
Nur um in Django hinzuzufügen, wenn Sie eine Frage haben wie:
tun:
um die SQL-Zeichenfolge zu erhalten
quelle