aboutsummaryrefslogtreecommitdiffstats
path: root/debug_toolbar
diff options
context:
space:
mode:
authorRob Hudson2008-09-11 23:21:12 -0700
committerRob Hudson2008-09-11 23:21:12 -0700
commit4591e34f0140c43e68e4ecd97eae7f3ea05878f6 (patch)
treecfb460212471d9d41b32e2732620822e3cf38e22 /debug_toolbar
parent8377ea179568c1fbf8f46db1234e85d689daae0a (diff)
downloaddjango-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.
Diffstat (limited to 'debug_toolbar')
-rw-r--r--debug_toolbar/templates/debug_toolbar/panels/sql_explain.html25
-rw-r--r--debug_toolbar/urls.py6
-rw-r--r--debug_toolbar/views.py30
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