Skip to content

Instantly share code, notes, and snippets.

@vstoykov
Last active August 14, 2024 06:11
Show Gist options
  • Save vstoykov/1390853 to your computer and use it in GitHub Desktop.
Save vstoykov/1390853 to your computer and use it in GitHub Desktop.
Django Middleware to print sql queries in debug console
"""
Originaly code was taken from http://djangosnippets.org/snippets/290/
But I was made some improvements like:
- print URL from what queries was
- don't show queries from static URLs (MEDIA_URL and STATIC_URL, also for /favicon.ico).
- If DEBUG is False tell to django to not use this middleware
- Remove guessing of terminal width (This breaks the rendered SQL)
"""
from django.core.exceptions import MiddlewareNotUsed
from django.conf import settings
from django.db import connection
class SQLPrintingMiddleware(object):
"""
Middleware which prints out a list of all SQL queries done
for each view that is processed. This is only useful for debugging.
"""
def __init__(self):
if not settings.DEBUG:
raise MiddlewareNotUsed
def process_response(self, request, response):
if (len(connection.queries) == 0 or
request.path_info.startswith('/favicon.ico') or
request.path_info.startswith(settings.STATIC_URL) or
request.path_info.startswith(settings.MEDIA_URL)):
return response
indentation = 2
print "\n\n%s\033[1;35m[SQL Queries for]\033[1;34m %s\033[0m\n" % (" " * indentation, request.path_info)
total_time = 0.0
for query in connection.queries:
nice_sql = query['sql'].replace('"', '').replace(',', ', ')
sql = "\033[1;31m[%s]\033[0m %s" % (query['time'], nice_sql)
total_time = total_time + float(query['time'])
print "%s%s\n" % (" " * indentation, sql)
replace_tuple = (" " * indentation, str(total_time), str(len(connection.queries)))
print "%s\033[1;32m[TOTAL TIME: %s seconds (%s queries)]\033[0m" % replace_tuple
return response
@AlekseiKhatkevich
Copy link

x = fcntl.ioctl(1, termios.TIOCGWINSZ, s) , where 1 could be chaged to sys.stdout.fileno()

also would be nice to swap args REPORTMAILTASK.USER_ID = :arg1 parts in displayed query to real values (for example REPORTMAILTASK.USER_ID = 888)

Nice gist though

@peacefulseeker
Copy link

peacefulseeker commented Aug 14, 2024

FYI: For newer version of django, would need to provide __init__ and __call__ methods for
class based middleware.(as per https://docs.djangoproject.com/en/5.0/topics/http/middleware/#writing-your-own-middleware_

def __init__(self, get_response):
    self.get_response = get_response

def __call__(self, request):
    response = self.get_response(request)

    response = self.process_response(request, response)

    return response

def process_response(self, request, response):
    ... # print SQL logic

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment