2010-02-22 12 views
44

Usando el excelente Django-Devserver estoy encontrando todo tipo de llamadas SQL interesantes e inesperadas en mi código. Quería encontrar de dónde venían las llamadas, así que estoy buscando una manera de obtener un registro o una impresión de todas las llamadas SQL generadas por el ORM de Django en el shell de Python. Es decir, cuando realizo una llamada a Django ORM a través del shell de Python, me gustaría ver el SQL resultante impreso o registrado.Django: muestra/registra llamadas ORM sql desde python shell

Me di cuenta de varias soluciones que agregan información de registro a la página html. ¿Hay una forma fácil de volcar a la línea de comando?

Respuesta

11

Si se encuentra en la cáscara, o en cualquier lugar para el caso, se puede utilizar el método queryset

query.as_sql() 

para imprimir el comando SQL.

es decir:

MyModel.objects.all().query.as_sql() 
+3

También puede hacer >>> imprimir MyModel.objects.all(). Query –

+1

Esta solución no funciona a partir de Django 1.2 – Zach

+0

sí, esto solo lo noté, es para Django 1.3 y después de –

28

Django Debug Toolbar de Rob Hudson, así como su asombro general, también incluye un muy ingenioso comando debugsqlshell manage.py que hace exactamente esto.

+0

Para encontrar de dónde provienen las llamadas y qué está sucediendo "detrás de escena", también recomendaría Django Debug Toolbar. No solo para el comando debugsqlshell sino también para la barra de herramientas actual que también tiene mucha información sobre llamadas SQL. – bjunix

5

Si usted es realmente serio sobre el deseo de ver/log todas las consultas SQL, tendrá que probar Django 1.3 (actualmente en alfa, pero que pronto será la producción) que permite Python loggers para muchos componentes, incluidos los servidores de base de datos.

Por supuesto, si estás atascado utilizando una versión estable de Django, se puede obtener el mismo efecto con relativa facilidad mediante parches django/db/models/sql/compiler.py añadiendo esto a la parte inferior de la lista de importación:

import logging 
_querylogger = logging.getLogger('sql.compiler') 

El hallazgo la SQLCompiler::execute_sql() método y el cambio:

cursor = self.connection.cursor() 
    cursor.execute(sql, params) 

a esto:

cursor = self.connection.cursor() 
    _querylogger.info("%s <= %s", sql, params) 
    cursor.execute(sql, params) 
+0

muy agradable, gracias –

6
qs = YourModel.objects.all() 

qs.query.get_compiler('default').as_sql() 
+0

str (qs) hace el trabajo también. –

+1

"imprimir qs" también funciona. – sleblanc

159

Si está utilizando Django 1.3:

import logging 
l = logging.getLogger('django.db.backends') 
l.setLevel(logging.DEBUG) 
l.addHandler(logging.StreamHandler()) 
+0

¿Qué sucede si uso django 1.2? – jrwren

+0

@jrwren, al menos para el desarrollo – Evgeny

+0

¡increíble! agregando este fragmento a mi archivo startup.py puedo imprimir información de depuración de SQL cada vez que depuro mi código en el shell django – nemesisdesign

20

yo estaba tratando de usar "Django: show/log ORM sql calls from python shell" en un shell en un servidor de producción, y no estaba trabajando. Finalmente, alguien señaló que solo hará este registro de depuración cuando DEBUG = True. Pero se puede evitar que de esta manera:

import logging 
from django.db import connection 
connection.force_debug_cursor = True # Change to use_debug_cursor in django < 1.8 
l = logging.getLogger('django.db.backends') 
l.setLevel(logging.DEBUG) 
l.addHandler(logging.StreamHandler()) 

Me marcho esta aquí para que pueda encontrarlo más tarde, y es de esperar que ahorra otra persona de la misma excavación que hice.

10

Utilice las extensiones django.

pip install django-extensions 
./manage.py shell_plus --print-sql 

Para entornos de producción, es posible que no funcione debido a la configuración de depuración.

Cuestiones relacionadas