Skip to content

Support for multi-db SQL views #155

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions debug_toolbar/templates/debug_toolbar/panels/sql.html
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@
<td>
{% if query.params %}
{% if query.is_select %}
<a class="remoteCall" href="/__debug__/sql_select/?sql={{ query.raw_sql|urlencode }}&amp;params={{ query.params|urlencode }}&amp;duration={{ query.duration|floatformat:"2"|urlencode }}&amp;hash={{ query.hash }}">SELECT</a><br />
<a class="remoteCall" href="/__debug__/sql_explain/?sql={{ query.raw_sql|urlencode }}&amp;params={{ query.params|urlencode }}&amp;duration={{ query.duration|floatformat:"2"|urlencode }}&amp;hash={{ query.hash }}">EXPLAIN</a><br />
<a class="remoteCall" href="/__debug__/sql_select/?sql={{ query.raw_sql|urlencode }}&amp;alias={{ query.alias|urlencode }}&amp;params={{ query.params|urlencode }}&amp;duration={{ query.duration|floatformat:"2"|urlencode }}&amp;hash={{ query.hash }}">SELECT</a><br />
<a class="remoteCall" href="/__debug__/sql_explain/?sql={{ query.raw_sql|urlencode }}&amp;alias={{ query.alias|urlencode }}&amp;params={{ query.params|urlencode }}&amp;duration={{ query.duration|floatformat:"2"|urlencode }}&amp;hash={{ query.hash }}">EXPLAIN</a><br />
{% if is_mysql %}
<a class="remoteCall" href="/__debug__/sql_profile/?sql={{ query.raw_sql|urlencode }}&amp;params={{ query.params|urlencode }}&amp;duration={{ query.duration|floatformat:"2"|urlencode }}&amp;hash={{ query.hash }}">PROFILE</a><br />
<a class="remoteCall" href="/__debug__/sql_profile/?sql={{ query.raw_sql|urlencode }}&amp;alias={{ query.alias|urlencode }}&amp;params={{ query.params|urlencode }}&amp;duration={{ query.duration|floatformat:"2"|urlencode }}&amp;hash={{ query.hash }}">PROFILE</a><br />
{% endif %}
{% endif %}
{% endif %}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ <h3>{% trans "SQL Explained" %}</h3>
<div class="djDebugPanelContent">
<div class="scroll">
<dl>
<dt>{% trans "Executed SQL" %}</dt>
<dt>{% trans "Executed SQL on database" %} <strong>{{ alias }}</strong></dt>
<dd>{{ sql|safe }}</dd>
<dt>{% trans "Time" %}</dt>
<dd>{{ duration }} ms</dd>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ <h3>{% trans "SQL Profiled" %}</h3>
<div class="scroll">
{% if result %}
<dl>
<dt>{% trans "Executed SQL" %}</dt>
<dt>{% trans "Executed SQL on database" %} <strong>{{ alias }}</strong></dt>
<dd>{{ sql|safe }}</dd>
<dt>{% trans "Time" %}</dt>
<dd>{{ duration }} ms</dd>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ <h3>{% trans "SQL Selected" %}</h3>
<div class="djDebugPanelContent">
<div class="scroll">
<dl>
<dt>{% trans "Executed SQL" %}</dt>
<dt>{% trans "Executed SQL on database" %} <strong>{{ alias }}</strong></dt>
<dd>{{ sql|safe }}</dd>
<dt>{% trans "Time" %}</dt>
<dd>{{ duration }} ms</dd>
Expand Down
18 changes: 12 additions & 6 deletions debug_toolbar/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
views in any other way is generally not advised.
"""

import os
import os
import django.views.static
from django.conf import settings
from django.db import connection
from django.db import connections
from django.http import HttpResponseBadRequest
from django.shortcuts import render_to_response
from django.utils import simplejson
Expand Down Expand Up @@ -38,18 +38,20 @@ def sql_select(request):
"""
from debug_toolbar.panels.sql import reformat_sql
sql = request.GET.get('sql', '')
alias = request.GET.get('alias', 'default')
params = request.GET.get('params', '')
hash = sha_constructor(settings.SECRET_KEY + sql + params).hexdigest()
if hash != request.GET.get('hash', ''):
return HttpResponseBadRequest('Tamper alert') # SQL Tampering alert
if sql.lower().strip().startswith('select'):
params = simplejson.loads(params)
cursor = connection.cursor()
cursor = connections[alias].cursor()
cursor.execute(sql, params)
headers = [d[0] for d in cursor.description]
result = cursor.fetchall()
cursor.close()
context = {
'alias': alias,
'result': result,
'sql': reformat_sql(cursor.db.ops.last_executed_query(cursor, sql, params)),
'duration': request.GET.get('duration', 0.0),
Expand All @@ -70,15 +72,16 @@ def sql_explain(request):
"""
from debug_toolbar.panels.sql import reformat_sql
sql = request.GET.get('sql', '')
alias = request.GET.get('alias', 'default')
params = request.GET.get('params', '')
hash = sha_constructor(settings.SECRET_KEY + sql + params).hexdigest()
if hash != request.GET.get('hash', ''):
return HttpResponseBadRequest('Tamper alert') # SQL Tampering alert
if sql.lower().strip().startswith('select'):
params = simplejson.loads(params)
cursor = connection.cursor()
cursor = connections[alias].cursor()

if settings.DATABASE_ENGINE == "sqlite3":
if settings.DATABASES[alias]['ENGINE'] == "django.db.backends.sqlite3":
# SQLite's EXPLAIN dumps the low-level opcodes generated for a query;
# EXPLAIN QUERY PLAN dumps a more human-readable summary
# See http://www.sqlite.org/lang_explain.html for details
Expand All @@ -90,6 +93,7 @@ def sql_explain(request):
result = cursor.fetchall()
cursor.close()
context = {
'alias' : alias,
'result': result,
'sql': reformat_sql(cursor.db.ops.last_executed_query(cursor, sql, params)),
'duration': request.GET.get('duration', 0.0),
Expand All @@ -110,13 +114,14 @@ def sql_profile(request):
"""
from debug_toolbar.panels.sql import reformat_sql
sql = request.GET.get('sql', '')
alias = request.GET.get('alias', 'default')
params = request.GET.get('params', '')
hash = sha_constructor(settings.SECRET_KEY + sql + params).hexdigest()
if hash != request.GET.get('hash', ''):
return HttpResponseBadRequest('Tamper alert') # SQL Tampering alert
if sql.lower().strip().startswith('select'):
params = simplejson.loads(params)
cursor = connection.cursor()
cursor = connections[alias].cursor()
result = None
headers = None
result_error = None
Expand All @@ -132,6 +137,7 @@ def sql_profile(request):
result_error = "Profiling is either not available or not supported by your database."
cursor.close()
context = {
'alias' : alias,
'result': result,
'result_error': result_error,
'sql': reformat_sql(cursor.db.ops.last_executed_query(cursor, sql, params)),
Expand Down