Come visualizzare la corrispondente query SQL del queryset di Django ORM?


164

Esiste un modo per stampare la query generata da Django ORM?

Di 'che eseguo la seguente dichiarazione: Model.objects.filter(name='test')

Come posso visualizzare la query SQL generata?

Risposte:


178

Ogni oggetto QuerySet ha un queryattributo che puoi registrare o stampare su stdout per scopi di debug.

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

modificare

Ho anche usato tag modello personalizzati (come indicato in questo snippet ) per iniettare le query nell'ambito di una singola richiesta come commenti HTML.


6
che dire delle query per .save ()?
Data accordo

@DataGreed Buona domanda, potrebbe valere la pena di fare una nuova discussione in modo da ottenere più risposte.
Joe Holloway,

4
Funziona con prefetch_relatedie show 2 query? Vedo solo 1.
utente

non funziona. vedo<django.db.models.sql.query.Query object
dopatraman il

Prova a stampare (str (qs.query)). Penso che abbiano cambiato un po 'gli interni in 10 anni
Joe Holloway il

114

È inoltre possibile utilizzare la registrazione Python per registrare tutte le query generate da Django. Basta aggiungere questo al file delle impostazioni.

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

Un altro metodo nel caso l'applicazione stia generando output html - può essere usata la barra degli strumenti di debug django .


3
Se qualcuno desidera avere un riepilogo con il riepilogo del numero di query eseguite e il tempo totale impiegato: dabapps.com/blog/logging-sql-queries-django-13
andilabs

9
Non ha funzionato per me, ho dovuto aggiungere 'level': 'DEBUG'sotto 'django.db'.
rvernica,

108

È possibile incollare questo codice sulla shell che visualizzerà tutte le query 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

Forse dovresti dare un'occhiata django-debug-toolbarall'applicazione, registrerà tutte le query per te, visualizzerà le informazioni di profilazione per loro e molto altro.


3
Questo è molto utile, ma funziona solo nella GUI e talvolta si desidera visualizzare i log delle query direttamente in ORM. ad esempio hai un API, senza GUI!
mercoledì

3

Una soluzione affidabile sarebbe quella di avere il tuo server di database di accedere a un file e quindi

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

2

Se stai utilizzando il routing del database, probabilmente hai più di una connessione al database. Codice come questo ti consente di vedere le connessioni in una sessione. Puoi ripristinare le statistiche allo stesso modo di una singola connessione: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

È possibile utilizzare una debug_toolbar di Django per visualizzare la query SQL. Guida dettagliata per l'utilizzo di debug_toolbar:

Installa Debug_toolbar

pip install django-debug-toolbar

Modifica il file settings.py e aggiungi debug_toolbar alle app installate, questo dovrebbe essere aggiunto di seguito a 'django.contrib.staticfiles'. Aggiungi anche debug_toolbar al middleware.

Settings.py =>

INSTALLED_APPS= [ 'debug_toolbar'] 

MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']

crea un nuovo elenco chiamato INTERNAL_IPS nel file settings.py

Settings.py => crea un nuovo elenco alla fine del file settings.py e aggiungi l'elenco seguente:

INTERNAL_IPS= [127.0.0.1']

Ciò consentirà l'esecuzione del debug solo sul server di sviluppo interno

Modifica il file urls.py di #Project e aggiungi il codice seguente:

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

applicare la migrazione ed eseguire nuovamente il server

Vedrai un componente aggiuntivo sulla tua pagina web in 127.0.0.1 e se fai clic sulla casella di controllo Query SQL, puoi effettivamente vedere anche il tempo di esecuzione della query.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.