Skip to content

Commit ec4c0c6

Browse files
committed
Simplify SQLPanel._queries data structure
Instead of using a list of tuples of (alias, query) pairs, store the alias as a field on the query like everything else and use a list of queries directly.
1 parent 6897235 commit ec4c0c6

File tree

2 files changed

+94
-108
lines changed

2 files changed

+94
-108
lines changed

debug_toolbar/panels/sql/panel.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,9 @@ def current_transaction_id(self, alias):
111111
trans_id = self.new_transaction_id(alias)
112112
return trans_id
113113

114-
def record(self, alias, **kwargs):
115-
self._queries.append((alias, kwargs))
114+
def record(self, **kwargs):
115+
self._queries.append(kwargs)
116+
alias = kwargs["alias"]
116117
if alias not in self._databases:
117118
self._databases[alias] = {
118119
"time_spent": kwargs["duration"],
@@ -193,7 +194,9 @@ def generate_stats(self, request, response):
193194

194195
# the last query recorded for each DB alias
195196
last_by_alias = {}
196-
for alias, query in self._queries:
197+
for query in self._queries:
198+
alias = query["alias"]
199+
197200
similar_query_groups[(alias, _similar_query_key(query))].append(query)
198201
duplicate_query_groups[(alias, _duplicate_query_key(query))].append(
199202
query
@@ -214,7 +217,6 @@ def generate_stats(self, request, response):
214217
if trans_id is not None:
215218
query["in_trans"] = True
216219

217-
query["alias"] = alias
218220
if "iso_level" in query:
219221
query["iso_level"] = get_isolation_level_display(
220222
query["vendor"], query["iso_level"]
@@ -263,7 +265,7 @@ def generate_stats(self, request, response):
263265
"databases": sorted(
264266
self._databases.items(), key=lambda x: -x[1]["time_spent"]
265267
),
266-
"queries": [q for a, q in self._queries],
268+
"queries": self._queries,
267269
"sql_time": self._sql_time,
268270
}
269271
)

tests/panels/test_sql.py

+87-103
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,13 @@ def test_recording(self):
4444
# ensure query was logged
4545
self.assertEqual(len(self.panel._queries), 1)
4646
query = self.panel._queries[0]
47-
self.assertEqual(query[0], "default")
48-
self.assertTrue("sql" in query[1])
49-
self.assertTrue("duration" in query[1])
50-
self.assertTrue("stacktrace" in query[1])
47+
self.assertEqual(query["alias"], "default")
48+
self.assertTrue("sql" in query)
49+
self.assertTrue("duration" in query)
50+
self.assertTrue("stacktrace" in query)
5151

5252
# ensure the stacktrace is populated
53-
self.assertTrue(len(query[1]["stacktrace"]) > 0)
53+
self.assertTrue(len(query["stacktrace"]) > 0)
5454

5555
@unittest.skipUnless(
5656
connection.vendor == "postgresql", "Test valid only on PostgreSQL"
@@ -128,7 +128,7 @@ def test_generate_server_timing(self):
128128
query = self.panel._queries[0]
129129

130130
expected_data = {
131-
"sql_time": {"title": "SQL 1 queries", "value": query[1]["duration"]}
131+
"sql_time": {"title": "SQL 1 queries", "value": query["duration"]}
132132
}
133133

134134
self.assertEqual(self.panel.get_server_timing_stats(), expected_data)
@@ -195,7 +195,7 @@ def test_param_conversion(self):
195195
expected_datetime = '["2017-12-22 16:07:01"]'
196196

197197
self.assertEqual(
198-
tuple(q[1]["params"] for q in self.panel._queries),
198+
tuple(query["params"] for query in self.panel._queries),
199199
(
200200
expected_bools,
201201
"[10, 1]",
@@ -217,7 +217,7 @@ def test_json_param_conversion(self):
217217
# ensure query was logged
218218
self.assertEqual(len(self.panel._queries), 1)
219219
self.assertEqual(
220-
self.panel._queries[0][1]["params"],
220+
self.panel._queries[0]["params"],
221221
'["{\\"foo\\": \\"bar\\"}"]',
222222
)
223223

@@ -237,7 +237,7 @@ def test_binary_param_force_text(self):
237237
self.assertIn(
238238
"<strong>SELECT</strong> * <strong>FROM</strong>"
239239
" tests_binary <strong>WHERE</strong> field =",
240-
self.panel._queries[0][1]["sql"],
240+
self.panel._queries[0]["sql"],
241241
)
242242

243243
@unittest.skipUnless(connection.vendor != "sqlite", "Test invalid for SQLite")
@@ -288,7 +288,7 @@ def test_raw_query_param_conversion(self):
288288
self.assertEqual(len(self.panel._queries), 2)
289289

290290
self.assertEqual(
291-
tuple(q[1]["params"] for q in self.panel._queries),
291+
tuple(query["params"] for query in self.panel._queries),
292292
(
293293
'["Foo", true, false, "2017-12-22 16:07:01"]',
294294
" ".join(
@@ -375,9 +375,9 @@ def test_execute_with_psycopg2_composed_sql(self):
375375
self.assertEqual(len(self.panel._queries), 1)
376376

377377
query = self.panel._queries[0]
378-
self.assertEqual(query[0], "default")
379-
self.assertTrue("sql" in query[1])
380-
self.assertEqual(query[1]["sql"], 'select "username" from "auth_user"')
378+
self.assertEqual(query["alias"], "default")
379+
self.assertTrue("sql" in query)
380+
self.assertEqual(query["sql"], 'select "username" from "auth_user"')
381381

382382
def test_disable_stacktraces(self):
383383
self.assertEqual(len(self.panel._queries), 0)
@@ -388,13 +388,13 @@ def test_disable_stacktraces(self):
388388
# ensure query was logged
389389
self.assertEqual(len(self.panel._queries), 1)
390390
query = self.panel._queries[0]
391-
self.assertEqual(query[0], "default")
392-
self.assertTrue("sql" in query[1])
393-
self.assertTrue("duration" in query[1])
394-
self.assertTrue("stacktrace" in query[1])
391+
self.assertEqual(query["alias"], "default")
392+
self.assertTrue("sql" in query)
393+
self.assertTrue("duration" in query)
394+
self.assertTrue("stacktrace" in query)
395395

396396
# ensure the stacktrace is empty
397-
self.assertEqual([], query[1]["stacktrace"])
397+
self.assertEqual([], query["stacktrace"])
398398

399399
@override_settings(
400400
DEBUG=True,
@@ -418,13 +418,13 @@ def test_regression_infinite_recursion(self):
418418
# template is loaded and basic.html extends base.html.
419419
self.assertEqual(len(self.panel._queries), 2)
420420
query = self.panel._queries[0]
421-
self.assertEqual(query[0], "default")
422-
self.assertTrue("sql" in query[1])
423-
self.assertTrue("duration" in query[1])
424-
self.assertTrue("stacktrace" in query[1])
421+
self.assertEqual(query["alias"], "default")
422+
self.assertTrue("sql" in query)
423+
self.assertTrue("duration" in query)
424+
self.assertTrue("stacktrace" in query)
425425

426426
# ensure the stacktrace is populated
427-
self.assertTrue(len(query[1]["stacktrace"]) > 0)
427+
self.assertTrue(len(query["stacktrace"]) > 0)
428428

429429
@override_settings(
430430
DEBUG_TOOLBAR_CONFIG={"PRETTIFY_SQL": True},
@@ -439,7 +439,7 @@ def test_prettify_sql(self):
439439

440440
response = self.panel.process_request(self.request)
441441
self.panel.generate_stats(self.request, response)
442-
pretty_sql = self.panel._queries[-1][1]["sql"]
442+
pretty_sql = self.panel._queries[-1]["sql"]
443443
self.assertEqual(len(self.panel._queries), 1)
444444

445445
# Reset the queries
@@ -450,7 +450,7 @@ def test_prettify_sql(self):
450450
response = self.panel.process_request(self.request)
451451
self.panel.generate_stats(self.request, response)
452452
self.assertEqual(len(self.panel._queries), 1)
453-
self.assertNotEqual(pretty_sql, self.panel._queries[-1][1]["sql"])
453+
self.assertNotEqual(pretty_sql, self.panel._queries[-1]["sql"])
454454

455455
self.panel._queries = []
456456
# Run it again, but with prettyify back on.
@@ -461,7 +461,7 @@ def test_prettify_sql(self):
461461
response = self.panel.process_request(self.request)
462462
self.panel.generate_stats(self.request, response)
463463
self.assertEqual(len(self.panel._queries), 1)
464-
self.assertEqual(pretty_sql, self.panel._queries[-1][1]["sql"])
464+
self.assertEqual(pretty_sql, self.panel._queries[-1]["sql"])
465465

466466
@override_settings(
467467
DEBUG=True,
@@ -479,7 +479,7 @@ def test_flat_template_information(self):
479479
self.assertEqual(len(self.panel._queries), 1)
480480

481481
query = self.panel._queries[0]
482-
template_info = query[1]["template_info"]
482+
template_info = query["template_info"]
483483
template_name = os.path.basename(template_info["name"])
484484
self.assertEqual(template_name, "flat.html")
485485
self.assertEqual(template_info["context"][2]["content"].strip(), "{{ users }}")
@@ -501,7 +501,7 @@ def test_nested_template_information(self):
501501
self.assertEqual(len(self.panel._queries), 1)
502502

503503
query = self.panel._queries[0]
504-
template_info = query[1]["template_info"]
504+
template_info = query["template_info"]
505505
template_name = os.path.basename(template_info["name"])
506506
self.assertEqual(template_name, "included.html")
507507
self.assertEqual(template_info["context"][0]["content"].strip(), "{{ users }}")
@@ -524,45 +524,37 @@ def test_similar_and_duplicate_grouping(self):
524524

525525
queries = self.panel._queries
526526
query = queries[0]
527-
self.assertEqual(query[1]["similar_count"], 3)
528-
self.assertEqual(query[1]["duplicate_count"], 2)
527+
self.assertEqual(query["similar_count"], 3)
528+
self.assertEqual(query["duplicate_count"], 2)
529529

530530
query = queries[1]
531-
self.assertEqual(query[1]["similar_count"], 3)
532-
self.assertEqual(query[1]["duplicate_count"], 2)
531+
self.assertEqual(query["similar_count"], 3)
532+
self.assertEqual(query["duplicate_count"], 2)
533533

534534
query = queries[2]
535-
self.assertEqual(query[1]["similar_count"], 3)
536-
self.assertTrue("duplicate_count" not in query[1])
535+
self.assertEqual(query["similar_count"], 3)
536+
self.assertTrue("duplicate_count" not in query)
537537

538538
query = queries[3]
539-
self.assertEqual(query[1]["similar_count"], 2)
540-
self.assertTrue("duplicate_count" not in query[1])
539+
self.assertEqual(query["similar_count"], 2)
540+
self.assertTrue("duplicate_count" not in query)
541541

542542
query = queries[4]
543-
self.assertEqual(query[1]["similar_count"], 2)
544-
self.assertTrue("duplicate_count" not in query[1])
543+
self.assertEqual(query["similar_count"], 2)
544+
self.assertTrue("duplicate_count" not in query)
545545

546546
query = queries[5]
547-
self.assertTrue("similar_count" not in query[1])
548-
self.assertTrue("duplicate_count" not in query[1])
547+
self.assertTrue("similar_count" not in query)
548+
self.assertTrue("duplicate_count" not in query)
549549

550-
self.assertEqual(queries[0][1]["similar_color"], queries[1][1]["similar_color"])
551-
self.assertEqual(queries[0][1]["similar_color"], queries[2][1]["similar_color"])
552-
self.assertEqual(
553-
queries[0][1]["duplicate_color"], queries[1][1]["duplicate_color"]
554-
)
555-
self.assertNotEqual(
556-
queries[0][1]["similar_color"], queries[0][1]["duplicate_color"]
557-
)
550+
self.assertEqual(queries[0]["similar_color"], queries[1]["similar_color"])
551+
self.assertEqual(queries[0]["similar_color"], queries[2]["similar_color"])
552+
self.assertEqual(queries[0]["duplicate_color"], queries[1]["duplicate_color"])
553+
self.assertNotEqual(queries[0]["similar_color"], queries[0]["duplicate_color"])
558554

559-
self.assertEqual(queries[3][1]["similar_color"], queries[4][1]["similar_color"])
560-
self.assertNotEqual(
561-
queries[0][1]["similar_color"], queries[3][1]["similar_color"]
562-
)
563-
self.assertNotEqual(
564-
queries[0][1]["duplicate_color"], queries[3][1]["similar_color"]
565-
)
555+
self.assertEqual(queries[3]["similar_color"], queries[4]["similar_color"])
556+
self.assertNotEqual(queries[0]["similar_color"], queries[3]["similar_color"])
557+
self.assertNotEqual(queries[0]["duplicate_color"], queries[3]["similar_color"])
566558

567559

568560
class SQLPanelMultiDBTestCase(BaseMultiDBTestCase):
@@ -580,10 +572,10 @@ def test_aliases(self):
580572
self.assertTrue(self.panel._queries)
581573

582574
query = self.panel._queries[0]
583-
self.assertEqual(query[0], "default")
575+
self.assertEqual(query["alias"], "default")
584576

585577
query = self.panel._queries[-1]
586-
self.assertEqual(query[0], "replica")
578+
self.assertEqual(query["alias"], "replica")
587579

588580
def test_transaction_status(self):
589581
"""
@@ -614,63 +606,55 @@ def test_transaction_status(self):
614606
self.assertEqual(len(self.panel._queries), 6)
615607

616608
query = self.panel._queries[0]
617-
self.assertEqual(query[0], "default")
618-
self.assertIsNotNone(query[1]["trans_id"])
619-
self.assertTrue(query[1]["starts_trans"])
620-
self.assertTrue(query[1]["in_trans"])
621-
self.assertFalse("end_trans" in query[1])
609+
self.assertEqual(query["alias"], "default")
610+
self.assertIsNotNone(query["trans_id"])
611+
self.assertTrue(query["starts_trans"])
612+
self.assertTrue(query["in_trans"])
613+
self.assertFalse("end_trans" in query)
622614

623615
query = self.panel._queries[-1]
624-
self.assertEqual(query[0], "replica")
625-
self.assertIsNone(query[1]["trans_id"])
626-
self.assertFalse("starts_trans" in query[1])
627-
self.assertFalse("in_trans" in query[1])
628-
self.assertFalse("end_trans" in query[1])
616+
self.assertEqual(query["alias"], "replica")
617+
self.assertIsNone(query["trans_id"])
618+
self.assertFalse("starts_trans" in query)
619+
self.assertFalse("in_trans" in query)
620+
self.assertFalse("end_trans" in query)
629621

630622
query = self.panel._queries[2]
631-
self.assertEqual(query[0], "default")
632-
self.assertIsNotNone(query[1]["trans_id"])
633-
self.assertEqual(
634-
query[1]["trans_id"], self.panel._queries[0][1]["trans_id"]
635-
)
636-
self.assertFalse("starts_trans" in query[1])
637-
self.assertTrue(query[1]["in_trans"])
638-
self.assertTrue(query[1]["ends_trans"])
623+
self.assertEqual(query["alias"], "default")
624+
self.assertIsNotNone(query["trans_id"])
625+
self.assertEqual(query["trans_id"], self.panel._queries[0]["trans_id"])
626+
self.assertFalse("starts_trans" in query)
627+
self.assertTrue(query["in_trans"])
628+
self.assertTrue(query["ends_trans"])
639629

640630
query = self.panel._queries[3]
641-
self.assertEqual(query[0], "replica")
642-
self.assertIsNotNone(query[1]["trans_id"])
643-
self.assertNotEqual(
644-
query[1]["trans_id"], self.panel._queries[0][1]["trans_id"]
645-
)
646-
self.assertTrue(query[1]["starts_trans"])
647-
self.assertTrue(query[1]["in_trans"])
648-
self.assertTrue(query[1]["ends_trans"])
631+
self.assertEqual(query["alias"], "replica")
632+
self.assertIsNotNone(query["trans_id"])
633+
self.assertNotEqual(query["trans_id"], self.panel._queries[0]["trans_id"])
634+
self.assertTrue(query["starts_trans"])
635+
self.assertTrue(query["in_trans"])
636+
self.assertTrue(query["ends_trans"])
649637

650638
query = self.panel._queries[4]
651-
self.assertEqual(query[0], "default")
652-
self.assertIsNotNone(query[1]["trans_id"])
653-
self.assertNotEqual(
654-
query[1]["trans_id"], self.panel._queries[0][1]["trans_id"]
655-
)
656-
self.assertNotEqual(
657-
query[1]["trans_id"], self.panel._queries[3][1]["trans_id"]
658-
)
659-
self.assertTrue(query[1]["starts_trans"])
660-
self.assertTrue(query[1]["in_trans"])
661-
self.assertTrue(query[1]["ends_trans"])
639+
self.assertEqual(query["alias"], "default")
640+
self.assertIsNotNone(query["trans_id"])
641+
self.assertNotEqual(query["trans_id"], self.panel._queries[0]["trans_id"])
642+
self.assertNotEqual(query["trans_id"], self.panel._queries[3]["trans_id"])
643+
self.assertTrue(query["starts_trans"])
644+
self.assertTrue(query["in_trans"])
645+
self.assertTrue(query["ends_trans"])
662646

663647
query = self.panel._queries[5]
664-
self.assertEqual(query[0], "replica")
665-
self.assertIsNone(query[1]["trans_id"])
666-
self.assertFalse("starts_trans" in query[1])
667-
self.assertFalse("in_trans" in query[1])
668-
self.assertFalse("end_trans" in query[1])
648+
self.assertEqual(query["alias"], "replica")
649+
self.assertIsNone(query["trans_id"])
650+
self.assertFalse("starts_trans" in query)
651+
self.assertFalse("in_trans" in query)
652+
self.assertFalse("end_trans" in query)
669653
else:
670654
# Ensure that nothing was recorded for other database engines.
671655
self.assertTrue(self.panel._queries)
672656
for query in self.panel._queries:
673-
self.assertFalse("trans_id" in query[1])
674-
self.assertFalse("starts_trans" in query[1])
675-
self.assertFalse("in_trans" in query[1])
676-
self.assertFalse("end_trans" in query[1])
657+
self.assertFalse("trans_id" in query)
658+
self.assertFalse("starts_trans" in query)
659+
self.assertFalse("in_trans" in query)
660+
self.assertFalse("end_trans" in query)

0 commit comments

Comments
 (0)