aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Hudson2008-09-11 23:21:12 -0700
committerRob Hudson2008-09-11 23:21:12 -0700
commit4591e34f0140c43e68e4ecd97eae7f3ea05878f6 (patch)
treecfb460212471d9d41b32e2732620822e3cf38e22
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.
-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