¿Hay alguna manera de mostrar el SQL que Django está ejecutando mientras realiza una consulta?
308
Consulte las preguntas frecuentes sobre 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 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".
Del informe de error Django # 17741 .
Debido a eso, no debe enviar el resultado de la consulta directamente a una base de datos.
str()
función Pythonian incorporada especificada , que invoca el__str__()
método interno . por ejemplostr(MyModel.objects.filter(name="my name").query)
, también recomendaría usar IPython y el shell Django de su proyecto. La finalización de la pestaña proporciona introspección de objetos Como Django es conocido por sus esquemas de nombres asertivos, esta metodología tiende a ser muy útil.query
SQL no es válida, 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/17741stable
, nodev
, para vincular a la versión actual de Django, de esta manera: docs.djangoproject.com/en/stable/faq/models/…Las extensiones Django tienen un comando shell_plus con un parámetro
print-sql
En django-shell se imprimirán todas las consultas ejecutadas
Ex.:
fuente
Eche un vistazo a debug_toolbar , es muy útil para la depuración.
La documentación y la fuente están disponibles en http://django-debug-toolbar.readthedocs.io/ .
fuente
fuente
m = MyModel.objects.get(...)
seguido porm.query
m
ya no es un conjunto de consultas. Usoq = MyModel.objects.filter(...)
, entoncesq.query
, entoncesm = q.get()
.Ninguna otra respuesta cubre este método, entonces:
Creo que, con mucho, el método más útil, simple y confiable es preguntarle a su base de datos. Por ejemplo, en Linux para Postgres, puede hacer:
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.
fuente
log_statement='all'
enpostgresql.conf
este método.postgresql.conf
corriendopsql -U postgres -c 'SHOW config_file'
Aunque puede hacerlo con el código suministrado, encuentro que usar la aplicación de la barra de herramientas de depuración es una gran 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 de consulta que tomó. También resume el número 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 el Django ORM detrás de escena. También tiene muchas otras características agradables, que puede usar si lo desea.
fuente
Otra opción, vea las opciones de registro en settings.py descritas en esta publicación
http://dabapps.com/blog/logging-sql-queries-django-13/
debug_toolbar ralentiza cada carga de página en su servidor de desarrollo, el registro no lo hace así que es más rápido. Las salidas 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 debug_toolbar ya que cada carga de página es muy lenta.
fuente
Si se asegura de que su archivo settings.py tenga:
django.core.context_processors.debug
enumerado enCONTEXT_PROCESSORS
DEBUG=True
IP
en laINTERNAL_IPS
tuplaEntonces deberías tener acceso a la
sql_queries
variable. Añado un pie de página a cada página que se ve así:Obtuve la variable
sql_time_sum
agregando la líneaa la función de depuración en django_src / django / core / context_processors.py.
fuente
Desarrollé una extensión para este propósito, para que pueda poner fácilmente un decorador en su función de vista y ver cuántas consultas se ejecutan.
Instalar:
Para usar como administrador de contexto:
Para usar como decorador:
Github: https://github.com/rabbit-aaron/django-print-sql
fuente
Creo que esto debería funcionar si está utilizando PostgreSQL:
fuente
Lo siguiente devuelve la consulta como SQL válido, basado en https://code.djangoproject.com/ticket/17741 :
fuente
He hecho un pequeño fragmento que puedes usar:
Toma como función de parámetros (contiene consultas sql) para inspeccionar y args, kwargs necesarios para llamar a esa función. Como resultado, devuelve qué función devuelve e imprime consultas SQL en una consola.
fuente
Puse esta función en un archivo util en una de las aplicaciones de mi proyecto:
Luego, cuando sea necesario, solo lo importo y lo llamo desde cualquier contexto (generalmente una vista) es necesario, por ejemplo:
Es bueno hacer esto fuera de la plantilla porque si tiene vistas de API (generalmente Django Rest Framework), también es aplicable allí.
fuente
Para Django 2.2:
Como la mayoría de las respuestas no me ayudaron mucho al usar
./manage.py shell
. Finalmente encontré la respuesta. Espero que esto ayude a alguien.Para ver todas las consultas:
Para ver la consulta de una sola consulta:
q.query
solo mostrando el objeto para mí. El uso de__str__()
(Representación de cadena) muestra la consulta completa.fuente
Ver consultas usando django.db.connection.queries
Acceda a la consulta SQL sin procesar en el objeto QuerySet
fuente
Solo para agregar, en django, si tiene una consulta como:
hacer:
para obtener la cadena sql
fuente