diff options
| author | Rob Hudson | 2008-09-11 23:21:12 -0700 |
|---|---|---|
| committer | Rob Hudson | 2008-09-11 23:21:12 -0700 |
| commit | 4591e34f0140c43e68e4ecd97eae7f3ea05878f6 (patch) | |
| tree | cfb460212471d9d41b32e2732620822e3cf38e22 | |
| parent | 8377ea179568c1fbf8f46db1234e85d689daae0a (diff) | |
| download | django-debug-toolbar-4591e34f0140c43e68e4ecd97eae7f3ea05878f6.tar.bz2 | |
Adding view to explain SQL passed in via query string. Hopefully this is
database backend agnostic. Next up is connecting this with the SQL panel via
AJAX.
| -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 |
