diff options
| -rw-r--r-- | debug_toolbar/templates/debug_toolbar/panels/sql_explain.html | 25 | ||||
| -rw-r--r-- | debug_toolbar/urls.py | 6 | ||||
| -rw-r--r-- | debug_toolbar/views.py | 30 | 
3 files changed, 61 insertions, 0 deletions
| diff --git a/debug_toolbar/templates/debug_toolbar/panels/sql_explain.html b/debug_toolbar/templates/debug_toolbar/panels/sql_explain.html new file mode 100644 index 0000000..757d43f --- /dev/null +++ b/debug_toolbar/templates/debug_toolbar/panels/sql_explain.html @@ -0,0 +1,25 @@ +<h3>SQL Explained</h3> +<dl> +	<dt>Executed SQL</dt> +	<dd><pre>{{ sql|wordwrap:80 }}</pre></dd> +	<dt>Time</dt> +	<dd>{{ time }} ms</dd> +</dl> +<table> +	<thead> +		<tr> +			{% for h in headers %} +				<th>{{ h|upper }}</th> +			{% endfor %} +		</tr> +	</thead> +	<tbody> +		{% for row in result %} +			<tr class="{% cycle 'row1' 'row2' %}"> +				{% for column in row %} +					<td>{{ column|escape }}</td> +				{% endfor %} +			</tr> +		{% endfor %} +	</tbody> +</table> diff --git a/debug_toolbar/urls.py b/debug_toolbar/urls.py new file mode 100644 index 0000000..24d4b12 --- /dev/null +++ b/debug_toolbar/urls.py @@ -0,0 +1,6 @@ +from django.conf.urls.defaults import * + +urlpatterns = patterns('', +    # EXPLAIN SQL via AJAX +    url(r'explain/$', 'debug_toolbar.views.explain', name='explain_sql'), +) diff --git a/debug_toolbar/views.py b/debug_toolbar/views.py new file mode 100644 index 0000000..5bdf450 --- /dev/null +++ b/debug_toolbar/views.py @@ -0,0 +1,30 @@ +import simplejson +from django.db import connection +from django.shortcuts import render_to_response +from debug_toolbar.panels.sql import reformat_sql + +def explain(request): +    """ +    Returns the output of the SQL EXPLAIN on the given query. +     +    Expected GET variables: +        sql: urlencoded sql with position arguments +        params: JSON encoded parameter values +        time: time for SQL to execute passed in from toolbar just for redisplay +    """ +    sql = request.GET.get('sql', '') +    if sql.lower().startswith('select'): +        params = simplejson.loads(request.GET.get('params', '')) +        cursor = connection.cursor() +        cursor.execute("EXPLAIN %s" % (sql,), params) +        headers = [d[0] for d in cursor.description] +        result = cursor.fetchall() +        cursor.close() +        context = { +            'result': result, +            'sql': reformat_sql(cursor.db.ops.last_executed_query(cursor, sql, params)), +            'time': request.GET.get('time', 0.0), +            'headers': headers, +        } +        return render_to_response('debug_toolbar/panels/sql_explain.html', context) +        
\ No newline at end of file | 
