2010-09-20 19 views
219

¿Cómo obtengo el SQL que Django usará en la base de datos desde un objeto QuerySet? Estoy intentando depurar algún comportamiento extraño, pero no estoy seguro de qué consultas van a la base de datos. Gracias por tu ayuda.Obtener el SQL de un Django QuerySet

+1

Esto no es un duplicado. la pregunta vinculada es un tema bastante diferente. – craigds

Respuesta

331

DE IMPRIMIR atributo del conjunto de consultas query.

>>> queryset = MyModel.objects.all() 
>>> print queryset.query 
SELECT "myapp_mymodel"."id", ... FROM "myapp_mymodel" 
+0

me encontré [esto] (https://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/#automatic-spatial-transformations) que menciona implícitamente pero nada que documenta explícitamente lo anterior – hanleyhansen

+10

Tenga en cuenta que el resultado 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: https://code.djangoproject.com/ticket/17741 – gregoltsov

+0

donde tengo que escribir la consulta ... MyModel es una clase que está en el archivo models.py ... Mi duda es donde tengo que escribir la consulta sql para recupera el valor de la tabla. –

48

Fácil:

print my_queryset.query 

Por ejemplo:

from django.contrib.auth.models import User 
print User.objects.filter(last_name__icontains = 'ax').query 

También hay que mencionar que si usted tiene debug = true, entonces todas sus consultas son grabadas, y se puede consígalos accediendo a connection.queries:

from django.db import connections 
connections['default'].queries 

El proyecto django debug toolbar utiliza esto para presentar las consultas en una página de una manera ordenada.

+1

Esto no siempre arroja un SQL válido, vea las otras respuestas – aehlke

+1

No hay forma de obtener el SQL real sin ejecutar la consulta primero, SQL final es generado por el controlador RDBMS circundante, no por Django. La respuesta es correcta, ya que es lo máximo que puedes obtener con Django QuerySet. – danigosa

9

Este middleware salida de todas las consultas SQL a la consola, con resaltado de color y tiempo de ejecución, ha sido de gran valor para mí en la optimización de algunas peticiones difíciles

http://djangosnippets.org/snippets/290/

8

Como alternativa a las otras respuestas, django-devserver salidas SQL a la consola.

26

The accepted answer no funcionó para mí cuando se utiliza Django 1.4.4. En lugar de la consulta sin formato, se devolvió una referencia al objeto Query: <django.db.models.sql.query.Query object at 0x10a4acd90>.

El siguiente volvieron la consulta:

>>> queryset = MyModel.objects.all() 
>>> queryset.query.__str__() 
+23

Probablemente no funcionó porque acabas de escribir 'queryset.query' en lugar de' print queryset.query', que llama a '__str __()' – hughes

+7

@hughes tiene razón. Si no desea imprimirlo y lo quiere como una cadena, en lugar de llamar '__str __()' para obtenerlo como una cadena, debe hacer 'str (queryset.query)'. – Chad

+1

Estoy usando ipdb para depurar e imprime una referencia al objeto de consulta cuando hago 'p queryset'. 'p queryset .__ str __()' produce el resultado deseado por lo que esta es una mejor respuesta. – Rafay

Cuestiones relacionadas