¿Cómo ver la consulta SQL correspondiente del conjunto de consultas de Django ORM?

164

¿Hay alguna manera de imprimir la consulta que genera el ORM de Django?

Digamos que ejecuto la siguiente declaración: Model.objects.filter(name='test')

¿Cómo puedo ver la consulta SQL generada?

Jarvis
fuente

Respuestas:

178

Cada objeto QuerySet tiene un queryatributo que puede registrar o imprimir en stdout para fines de depuración.

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

Editar

También he usado etiquetas de plantilla personalizadas (como se describe en este fragmento ) para inyectar las consultas en el ámbito de una sola solicitud como comentarios HTML.

Joe Holloway
fuente
66
¿Qué pasa con las consultas para .save ()?
DataGreed
@DataGreed Buena pregunta, podría valer la pena hacerla en un nuevo hilo para que obtenga más respuestas.
Joe Holloway
44
¿Funciona con, por prefetch_relatedejemplo, mostrar 2 consultas? Solo veo 1.
usuario
no funciona <django.db.models.sql.query.Query object
Ya
Prueba print (str (qs.query)). Creo que han cambiado un poco las partes internas en 10 años
Joe Holloway
114

También puede usar el registro de Python para registrar todas las consultas generadas por Django. Simplemente agregue esto a su archivo de configuración.

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

Otro método en caso de que la aplicación genere una salida html: se puede usar la barra de herramientas de depuración de django .

aisbaa
fuente
3
Si alguien quisiera tener un resumen con la suma del número de consultas ejecutadas y el tiempo total que tomó: dabapps.com/blog/logging-sql-queries-django-13
andilabs
9
No funcionó para mí, tuve que agregar 'level': 'DEBUG'debajo 'django.db'.
rvernica
108

Puede pegar este código en su shell que mostrará todas las consultas 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())
Pramod
fuente
72

Mientras DEBUGesté encendido:

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

Para una consulta individual, puede hacer:

print(Model.objects.filter(name='test').query)
Daniel Roseman
fuente
22
Nota para los lectores: querydevuelve el Queryobjeto desde Djagno 1.2 que no tiene as_sqlatributo.
Davor Lucic
30

Tal vez debería echar un vistazo a la django-debug-toolbaraplicación, registrará todas las consultas por usted, mostrará información de perfil para ellas y mucho más.

Mikhail Korobov
fuente
3
Esto es muy útil, pero solo funciona en la GUI y, a veces, desea ver los registros de consultas directamente en ORM. Por ejemplo, tiene una API, sin GUI!
wim
3

Una solución sólida sería hacer que su servidor de base de datos inicie sesión en un archivo y luego

tail -f /path/to/the/log/file.log
alan
fuente
2

Si está utilizando el enrutamiento de la base de datos, probablemente tenga más de una conexión de base de datos. Un código como este le permite ver las conexiones en una sesión. Puede restablecer las estadísticas de la misma manera que con una sola conexión: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() )
Tim Richardson
fuente
1

Puede usar una barra de herramientas debug_tool de Django para ver la consulta SQL. Guía paso a paso para el uso de debug_toolbar:

Instala Debug_toolbar

pip install django-debug-toolbar

Edite el archivo settings.py y agregue debug_toolbar a las aplicaciones instaladas, esto se debe agregar a continuación a 'django.contrib.staticfiles'. Agregue también debug_toolbar a Middleware.

Settings.py =>

INSTALLED_APPS= [ 'debug_toolbar'] 

MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']

crear una nueva lista llamada INTERNAL_IPS en el archivo settings.py

Settings.py => crea una nueva lista al final del archivo settings.py y agrega la lista a continuación:

INTERNAL_IPS= [127.0.0.1']

Esto permitirá que la depuración se ejecute solo en el servidor de desarrollo interno

Edite el archivo urls.py de #Project y agregue el siguiente código:

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

aplicar migrar y ejecutar el servidor nuevamente

Verá un complemento en su página web en 127.0.0.1 y si hace clic en la casilla de verificación Consulta SQL, también puede ver el tiempo de ejecución de la consulta.

Devesh G
fuente