2011-11-13 9 views
7

Puede imprimir SQL de un conjunto de consultas de la siguiente manera:impresión Django QuerySet SQL con ""

print str(queryset.query) 

sin embargo, por alguna razón esto elimina las comillas, por lo que se obtiene:

SELECT `tableA`.`fieldA` FROM `fieldA` WHERE `tableA`.`fieldB` = Foo 

en lugar de:

SELECT `tableA`.`fieldA` FROM `fieldA` WHERE `tableA`.`fieldB` = "Foo" 

aviso de la falta ""

¿Cómo se puede corregir esto?

+0

Los servidores de la base de datos pasan la plantilla de consulta y los parámetros por separado a su base de datos. Django mismo nunca debe crear una consulta correctamente citada con marcadores de posición rellenos. Es por eso que solo obtiene esta solución incompleta para la depuración. – lanzz

Respuesta

3

no es exactamente lo que quiere, pero si usted tiene DEBUG = True puede utilizar

from django.db import connection 
connection.queries 

actualización:

Mirando a la Queryset__str__ método:

__str__(self) 
|  Returns the query as a string of SQL with the parameter values 
|  substituted in. 
|  
|  Parameter values won't necessarily be quoted correctly, since that is 
|  done by the database interface at execution time. 
+0

Eso funciona solo después de que se envió la consulta, pero necesito que se imprima antes en caso de que algo salga mal con la búsqueda – Jonathan

1

Si se trata de depuración Para ello, debe buscar en django-debug-toolbar que le mostrará todas las consultas ejecutadas para cualquier vista que esté viendo

5

Si la base de datos subyacente es PostgreSQL que puede hacer:

from django.db import connection 
sql, params = queryset.query.sql_with_params() 
cursor = connection.cursor() 
cursor.mogrify(sql, params) 

sql_with_params devuelve la consulta simple, sin ningún valor sustituidos y los parámetros que se pueden insertar en la consulta.

Todavía es no recomendado para usar .mogrify() para otros fines que la depuración porque el método puede desaparecer en el futuro.

Si desea ejecutar la consulta, puede/debería simplemente usar .raw().

YourModel.objects.raw(sql, params) 
Cuestiones relacionadas