¿Cómo ver las consultas SQL sin procesar que Django está ejecutando?

6 minutos de lectura

avatar de usuario
gasto91

¿Hay alguna manera de mostrar el SQL que se está ejecutando Django mientras se realiza una consulta?

avatar de usuario
geowa4

Consulte las preguntas frecuentes de los documentos: “¿Cómo puedo ver las consultas SQL sin procesar que Django está ejecutando?

django.db.connection.queries contiene una lista de las consultas SQL:

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

Los conjuntos de consultas también tienen un query atributo que contiene la consulta a ejecutar:

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

Tenga en cuenta que el resultado de la consulta no es un SQL válido porque:

“Django en realidad nunca interpola los parámetros: envía la consulta y los parámetros por separado al adaptador de la base de datos, que realiza las operaciones apropiadas”.

Del informe de errores de Django #17741.

Por eso, no debe enviar la salida de la consulta directamente a una base de datos.

Si necesita restablecer las consultas para, por ejemplo, ver cuántas consultas se están ejecutando en un período determinado, puede usar reset_queries de django.db:

from django.db import reset_queries

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

  • Para probar esta respuesta en el futuro, debería vincular la versión actual de la documentación de Django: docs.djangoproject.com/en/dev/faq/models/…

    – André Miller

    2 de julio de 2009 a las 13:31

  • Gran respuesta. Sin embargo, se recomienda utilizar el Pythonian incorporado especificado. str() función, que invoca la función interna __str__() método. p.ej str(MyModel.objects.filter(name="my name").query) También recomendaría usar IPython y el shell Django de su proyecto. La finalización de tabulación proporciona una introspección de objetos. Como Django es conocido por sus esquemas de nombres asertivos, esta metodología tiende a ser muy útil.

    –Lorenz Lo Sauer

    24 de julio de 2013 a las 5:55

  • Tenga en cuenta que la salida de query no es SQL válido, porque “Django nunca interpola los parámetros: envía la consulta y los parámetros por separado al adaptador de la base de datos, que realiza las operaciones apropiadas”. Fuente: code.djangoproject.com/ticket/17741

    – gregoltsov

    7 julio 2014 a las 14:51

  • @AndreMiller Deberías usar stableno devpara vincular a la versión actual de Django, así: docs.djangoproject.com/en/stable/faq/models/…

    – Flamm

    04/04/2017 a las 14:35

  • django.db.connection.queries devuelve una lista vacía

    – Fantasía

    5 de agosto de 2019 a las 13:21

Django-extensiones tener un comando shell_plus con un parámetro print-sql

./manage.py shell_plus --print-sql

En django-shell se imprimirán todas las consultas ejecutadas

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>

  • Lo estoy usando con –print-sql o con SHELL_PLUS_PRINT_SQL = True y no ayuda, todavía no puedo ver las consultas. ¿Alguna idea de por qué? Django 1.8

    – Dejell

    16 de mayo de 2017 a las 9:43


  • Debe configurar DEBUG = True en su configuración.py para ver consultas

    – Konstantin Voschanov

    11 de diciembre de 2019 a las 13:02

  • Esta respuesta es un regalo del cielo.

    – rustyshackleford

    16 de junio a las 23:51

avatar de usuario
claror

Echa un vistazo a barra de herramientas de depuraciónes muy útil para la depuración.

La documentación y la fuente están disponibles en http://django-debug-toolbar.readthedocs.io/.

Captura de pantalla de la barra de herramientas de depuración

  • debug_toolbar es especialmente útil cuando tiene una consulta que falla con un error de sintaxis SQL; mostrará la última consulta que intentó ejecutarse (y falló), lo que facilita la depuración.

    – primicias siete

    16 de agosto de 2012 a las 17:20

  • Lo único es que ves consultas SQL en el navegador. Si ejecuta pruebas desde la terminal y desea verlo allí, esta no es una solución viable. Sigue siendo genial, lo he estado usando hasta el día de hoy.

    –Eray Erdin

    5 de diciembre de 2019 a las 12:47

  • Muestra todas las consultas como ‘Ninguna’ si se ejecutan dentro de Docker.

    – EugZol

    10 de enero de 2021 a las 1:19

  • @EugZol, echa un vistazo aquímencionaron a Docker al configurar INTERNAL_IPS tal vez eso ayude

    – Billal

    21 de febrero a las 16:13


avatar de usuario
jgabrielsk8

La consulta está realmente incrustada en la API de modelos:

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

print(q.query)

Ninguna otra respuesta cubre este método, entonces:

Creo que, con mucho, el método más útil, simple y confiable es preguntar a su base de datos. Por ejemplo, en Linux para Postgres podrías hacer:

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

Cada base de datos tendrá un procedimiento ligeramente diferente. En los registros de la base de datos, verá no solo el SQL sin procesar, sino también cualquier configuración de conexión o sobrecarga de transacciones que django esté colocando en el sistema.

  • no olvides configurar log_statement='all' en postgresql.conf para este método.

    – RickyA

    22 de febrero de 2016 a las 11:33

  • Puedes encontrar tu postgresql.conf mediante la ejecución psql -U postgres -c 'SHOW config_file'

    – kramer65

    1 de octubre de 2019 a las 7:23

avatar de usuario
googletorp

Aunque puede hacerlo con el código proporcionado, creo que usar la aplicación de la barra de herramientas de depuración es una excelente herramienta para mostrar consultas. Puedes descargarlo desde github aquí.

Esto le da la opción de mostrar todas las consultas ejecutadas en una página determinada junto con el tiempo que tomó realizar la consulta. También resume la cantidad de consultas en una página junto con el tiempo total para una revisión rápida. Esta es una gran herramienta, cuando quieres ver lo que hace Django ORM detrás de escena. También tiene muchas otras características interesantes, que puede usar si lo desea.

  • no olvides configurar log_statement='all' en postgresql.conf para este método.

    – RickyA

    22 de febrero de 2016 a las 11:33

  • Puedes encontrar tu postgresql.conf mediante la ejecución psql -U postgres -c 'SHOW config_file'

    – kramer65

    1 de octubre de 2019 a las 7:23

Otra opción, consulte las opciones de registro en settings.py descritas en esta publicación

http://dabapps.com/blog/logging-sql-queries-django-13/

debug_toolbar ralentiza la carga de cada página en su servidor de desarrollo, el registro no lo hace, por lo que es más rápido. Los resultados se pueden volcar a la consola o al archivo, por lo que la interfaz de usuario no es tan agradable. Pero para las vistas con muchos SQL, puede llevar mucho tiempo depurar y optimizar los SQL a través de la barra de herramientas de depuración, ya que la carga de cada página es muy lenta.

  • ¡Excelente! Si bien la barra de herramientas se ve muy bien, creo que esta respuesta debería ser la aceptada. Esta es la solución que quería porque permite que “manage.py runserver” registre SQL en la consola y funciona con “manage.py migrate”. Este último me dejó ver que “en cascada de eliminación” definitivamente no se configuró cuando se crearon mis tablas. Vale la pena señalar que esta respuesta se basa en docs.djangoproject.com/en/1.9/topics/logging/…

    – Sr. Lance E Sloan

    11/03/2016 a las 17:41


¿Ha sido útil esta solución?