Skip to content

Commit a2ed32c

Browse files
authored
Merge pull request #1104 from todorvelichkov/fix-rawqueryset
Fix displaying RawQuerySet in sql_explain view
2 parents 07b063c + f4af19d commit a2ed32c

File tree

3 files changed

+61
-1
lines changed

3 files changed

+61
-1
lines changed

debug_toolbar/panels/sql/tracking.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ def _record(self, method, sql, params):
124124
stacktrace = []
125125
_params = ''
126126
try:
127-
_params = json.dumps([self._decode(p) for p in params])
127+
_params = json.dumps(self._decode(params))
128128
except TypeError:
129129
pass # object not JSON serializable
130130

tests/panels/test_sql.py

+49
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,55 @@ def test_param_conversion(self):
122122
'["2017-12-22 16:07:01"]'
123123
))
124124

125+
@unittest.skipUnless(connection.vendor != 'sqlite',
126+
'Test invalid for SQLite')
127+
def test_raw_query_param_conversion(self):
128+
self.assertEqual(len(self.panel._queries), 0)
129+
130+
list(User.objects.raw(
131+
" ".join([
132+
"SELECT *",
133+
"FROM auth_user",
134+
"WHERE first_name = %s",
135+
"AND is_staff = %s",
136+
"AND is_superuser = %s",
137+
"AND date_joined = %s",
138+
]),
139+
params=['Foo', True, False, datetime.datetime(2017, 12, 22, 16, 7, 1)],
140+
))
141+
142+
list(User.objects.raw(
143+
" ".join([
144+
"SELECT *",
145+
"FROM auth_user",
146+
"WHERE first_name = %(first_name)s",
147+
"AND is_staff = %(is_staff)s",
148+
"AND is_superuser = %(is_superuser)s",
149+
"AND date_joined = %(date_joined)s"
150+
]),
151+
params={
152+
'first_name': 'Foo',
153+
'is_staff': True,
154+
'is_superuser': False,
155+
'date_joined': datetime.datetime(2017, 12, 22, 16, 7, 1)},
156+
))
157+
158+
self.panel.process_response(self.request, self.response)
159+
self.panel.generate_stats(self.request, self.response)
160+
161+
# ensure query was logged
162+
self.assertEqual(len(self.panel._queries), 2)
163+
164+
self.assertEqual(tuple([q[1]['params'] for q in self.panel._queries]), (
165+
'["Foo", true, false, "2017-12-22 16:07:01"]',
166+
" ".join([
167+
'{"first_name": "Foo",',
168+
'"is_staff": true,',
169+
'"is_superuser": false,',
170+
'"date_joined": "2017-12-22 16:07:01"}'
171+
])
172+
))
173+
125174
def test_insert_content(self):
126175
"""
127176
Test that the panel only inserts content after generate_stats and

tests/settings.py

+11
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,17 @@
9191
'NAME': 'debug-toolbar',
9292
}
9393
}
94+
elif os.environ.get('DJANGO_DATABASE_ENGINE') == 'mysql':
95+
# % mysql
96+
# mysql> CREATE USER 'debug_toolbar'@'localhost' IDENTIFIED BY '';
97+
# mysql> GRANT ALL PRIVILEGES ON debug_toolbar.* TO 'test_debug_toolbar'@'localhost';
98+
DATABASES = {
99+
'default': {
100+
'ENGINE': 'django.db.backends.mysql',
101+
'NAME': 'debug_toolbar',
102+
'USER': 'debug_toolbar',
103+
}
104+
}
94105
else:
95106
DATABASES = {
96107
'default': {

0 commit comments

Comments
 (0)