SQL Debug en Django

¿Cómo saber en Django qué sentencias SQL se están ejecutando detrás de su ORM? Según la FAQ, podemos hacerlo de esta forma:

Make sure your Django DEBUG setting is set to True. Then, just do this:

>>> from django.db import connection
>>> connection.queries
[{'sql': 'SELECT polls_polls.id,polls_polls.question,polls_polls.pub_date FROM polls_polls',
'time': '0.002'}]

connection.queries is only available if DEBUG is True. It’s a list of dictionaries in order of query execution. Each dictionary has the following:

“sql“ — The raw SQL statement
“time“ — How long the statement took to execute, in seconds.

connection.queries includes all SQL statements — INSERTs, UPDATES, SELECTs, etc. Each time your app hits the database, the query will be recorded.

Cada vez que se realiza una nueva petición, esa variable es sobre escrita con las consultas que se ejecutaron en la vista asociada. La forma de verlas es accediendo a connection.queries en cada vista de nuestro interés. Para facilitar esta tarea y no tener código intrusivo, escribí un decorador:

from django.db import connection
def sql_debug(f):
    '''
    Decorador útil para inspeccionar las sentencias SQL que se ejecutan en
    cada request.
    '''
    def inner(*args, **kwargs):
        r = f(*args, **kwargs)
        for d in connection.queries:
            print "time: %s\n sql:%s\n\n" % (d['time'], d['sql'])
        return r
    return inner

Acerca de Juanjo

Mi nombre es Juanjo Conti, vivo en Santa Fe y soy Ingeniero en Sistemas de Información. Mi lenguaje de programación de cabecera es Python; lo uso para trabajar, estudiar y jugar.
Esta entrada fue publicada en Django y etiquetada , , , . Guarda el enlace permanente.
  • Juanjo
    El código del decorador puede modificarse para escribir el resultado en un archivo o utilizar el módulo logging.
blog comments powered by Disqus