Risposte:
Ogni oggetto QuerySet ha un query
attributo 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.
prefetch_related
ie show 2 query? Vedo solo 1.
<django.db.models.sql.query.Query object
È 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 .
'level': 'DEBUG'
sotto 'django.db'
.
Finché DEBUG
è attivo:
from django.db import connection
print(connection.queries)
Per una singola query, puoi fare:
print(Model.objects.filter(name='test').query)
query
restituisce Query
oggetto dal Djagno 1.2 che non ha as_sql
attributo.
Forse dovresti dare un'occhiata django-debug-toolbar
all'applicazione, registrerà tutte le query per te, visualizzerà le informazioni di profilazione per loro e molto altro.
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() )
È possibile utilizzare una debug_toolbar di Django per visualizzare la query SQL. Guida dettagliata per l'utilizzo di debug_toolbar:
pip install django-debug-toolbar
Settings.py =>
INSTALLED_APPS= [ 'debug_toolbar']
MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']
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
if settings.DEBUG:
import debug_toolbar
urlpatterns = [
url(r'^__debug__/', include(debug_toolbar.urls))
] + urlpatterns
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.