Skip to content

Commit a350f94

Browse files
committed
Support multiple databases in profile, select, and explain calls (fixes #155)
1 parent 31a19aa commit a350f94

File tree

5 files changed

+20
-7
lines changed

5 files changed

+20
-7
lines changed

debug_toolbar/templates/debug_toolbar/panels/sql.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@
4242
<td class="actions">
4343
{% if query.params %}
4444
{% if query.is_select %}
45-
<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 }}">Sel</a>
46-
<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 }}">Expl</a>
45+
<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 }}&amp;alias={{ query.alias|urlencode }}">Sel</a>
46+
<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 }}&amp;alias={{ query.alias|urlencode }}">Expl</a>
4747
{% ifequal query.engine 'mysql' %}
48-
<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 }}">Prof</a>
48+
<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 }}&amp;alias={{ query.alias|urlencode }}">Prof</a>
4949
{% endifequal %}
5050
{% endif %}
5151
{% endif %}

debug_toolbar/templates/debug_toolbar/panels/sql_explain.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ <h3>{% trans "SQL Explained" %}</h3>
1010
<dd>{{ sql|safe }}</dd>
1111
<dt>{% trans "Time" %}</dt>
1212
<dd>{{ duration }} ms</dd>
13+
<dt>{% trans "Database" %}</dt>
14+
<dd>{{ alias }}</dd>
1315
</dl>
1416
<table class="djSqlExplain">
1517
<thead>

debug_toolbar/templates/debug_toolbar/panels/sql_profile.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ <h3>{% trans "SQL Profiled" %}</h3>
1111
<dd>{{ sql|safe }}</dd>
1212
<dt>{% trans "Time" %}</dt>
1313
<dd>{{ duration }} ms</dd>
14+
<dt>{% trans "Database" %}</dt>
15+
<dd>{{ alias }}</dd>
1416
</dl>
1517
<table class="djSqlProfile">
1618
<thead>

debug_toolbar/templates/debug_toolbar/panels/sql_select.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ <h3>{% trans "SQL Selected" %}</h3>
1010
<dd>{{ sql|safe }}</dd>
1111
<dt>{% trans "Time" %}</dt>
1212
<dd>{{ duration }} ms</dd>
13+
<dt>{% trans "Database" %}</dt>
14+
<dd>{{ alias }}</dd>
1315
</dl>
1416
{% if result %}
1517
<table class="djSqlSelect">

debug_toolbar/views.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77
import os
88
import django.views.static
99
from django.conf import settings
10-
from django.db import connection
1110
from django.http import HttpResponseBadRequest
1211
from django.shortcuts import render_to_response
1312
from django.utils import simplejson
1413
from django.utils.hashcompat import sha_constructor
1514

15+
from debug_toolbar.utils.compat.db import connections
16+
1617
class InvalidSQLError(Exception):
1718
def __init__(self, value):
1819
self.value = value
@@ -39,12 +40,13 @@ def sql_select(request):
3940
from debug_toolbar.panels.sql import reformat_sql
4041
sql = request.GET.get('sql', '')
4142
params = request.GET.get('params', '')
43+
alias = request.GET.get('alias', 'default')
4244
hash = sha_constructor(settings.SECRET_KEY + sql + params).hexdigest()
4345
if hash != request.GET.get('hash', ''):
4446
return HttpResponseBadRequest('Tamper alert') # SQL Tampering alert
4547
if sql.lower().strip().startswith('select'):
4648
params = simplejson.loads(params)
47-
cursor = connection.cursor()
49+
cursor = connections[alias].cursor()
4850
cursor.execute(sql, params)
4951
headers = [d[0] for d in cursor.description]
5052
result = cursor.fetchall()
@@ -54,6 +56,7 @@ def sql_select(request):
5456
'sql': reformat_sql(cursor.db.ops.last_executed_query(cursor, sql, params)),
5557
'duration': request.GET.get('duration', 0.0),
5658
'headers': headers,
59+
'alias': alias,
5760
}
5861
return render_to_response('debug_toolbar/panels/sql_select.html', context)
5962
raise InvalidSQLError("Only 'select' queries are allowed.")
@@ -71,12 +74,13 @@ def sql_explain(request):
7174
from debug_toolbar.panels.sql import reformat_sql
7275
sql = request.GET.get('sql', '')
7376
params = request.GET.get('params', '')
77+
alias = request.GET.get('alias', 'default')
7478
hash = sha_constructor(settings.SECRET_KEY + sql + params).hexdigest()
7579
if hash != request.GET.get('hash', ''):
7680
return HttpResponseBadRequest('Tamper alert') # SQL Tampering alert
7781
if sql.lower().strip().startswith('select'):
7882
params = simplejson.loads(params)
79-
cursor = connection.cursor()
83+
cursor = connections[alias].cursor()
8084

8185
if settings.DATABASE_ENGINE == "sqlite3":
8286
# SQLite's EXPLAIN dumps the low-level opcodes generated for a query;
@@ -94,6 +98,7 @@ def sql_explain(request):
9498
'sql': reformat_sql(cursor.db.ops.last_executed_query(cursor, sql, params)),
9599
'duration': request.GET.get('duration', 0.0),
96100
'headers': headers,
101+
'alias': alias,
97102
}
98103
return render_to_response('debug_toolbar/panels/sql_explain.html', context)
99104
raise InvalidSQLError("Only 'select' queries are allowed.")
@@ -111,12 +116,13 @@ def sql_profile(request):
111116
from debug_toolbar.panels.sql import reformat_sql
112117
sql = request.GET.get('sql', '')
113118
params = request.GET.get('params', '')
119+
alias = request.GET.get('alias', 'default')
114120
hash = sha_constructor(settings.SECRET_KEY + sql + params).hexdigest()
115121
if hash != request.GET.get('hash', ''):
116122
return HttpResponseBadRequest('Tamper alert') # SQL Tampering alert
117123
if sql.lower().strip().startswith('select'):
118124
params = simplejson.loads(params)
119-
cursor = connection.cursor()
125+
cursor = connections[alias].cursor()
120126
result = None
121127
headers = None
122128
result_error = None
@@ -137,6 +143,7 @@ def sql_profile(request):
137143
'sql': reformat_sql(cursor.db.ops.last_executed_query(cursor, sql, params)),
138144
'duration': request.GET.get('duration', 0.0),
139145
'headers': headers,
146+
'alias': alias,
140147
}
141148
return render_to_response('debug_toolbar/panels/sql_profile.html', context)
142149
raise InvalidSQLError("Only 'select' queries are allowed.")

0 commit comments

Comments
 (0)