55from debug_toolbar .decorators import render_with_toolbar_language , require_show_toolbar
66from debug_toolbar .forms import SignedDataForm
77from debug_toolbar .panels .sql .forms import SQLSelectForm
8+ from debug_toolbar .panels .sql .utils import reformat_sql
89
910
1011def get_signed_data (request ):
@@ -27,19 +28,14 @@ def sql_select(request):
2728 form = SQLSelectForm (verified_data )
2829
2930 if form .is_valid ():
30- sql = form .cleaned_data ["raw_sql" ]
31- params = form .cleaned_data ["params" ]
32- with form .cursor as cursor :
33- cursor .execute (sql , params )
34- headers = [d [0 ] for d in cursor .description ]
35- result = cursor .fetchall ()
36-
31+ query = form .cleaned_data ["query" ]
32+ result , headers = form .select ()
3733 context = {
3834 "result" : result ,
39- "sql" : form . reformat_sql (),
40- "duration" : form . cleaned_data ["duration" ],
35+ "sql" : reformat_sql (query [ "sql" ], with_toggle = False ),
36+ "duration" : query ["duration" ],
4137 "headers" : headers ,
42- "alias" : form . cleaned_data ["alias" ],
38+ "alias" : query ["alias" ],
4339 }
4440 content = render_to_string ("debug_toolbar/panels/sql_select.html" , context )
4541 return JsonResponse ({"content" : content })
@@ -57,28 +53,14 @@ def sql_explain(request):
5753 form = SQLSelectForm (verified_data )
5854
5955 if form .is_valid ():
60- sql = form .cleaned_data ["raw_sql" ]
61- params = form .cleaned_data ["params" ]
62- vendor = form .connection .vendor
63- with form .cursor as cursor :
64- if vendor == "sqlite" :
65- # SQLite's EXPLAIN dumps the low-level opcodes generated for a query;
66- # EXPLAIN QUERY PLAN dumps a more human-readable summary
67- # See https://www.sqlite.org/lang_explain.html for details
68- cursor .execute (f"EXPLAIN QUERY PLAN { sql } " , params )
69- elif vendor == "postgresql" :
70- cursor .execute (f"EXPLAIN ANALYZE { sql } " , params )
71- else :
72- cursor .execute (f"EXPLAIN { sql } " , params )
73- headers = [d [0 ] for d in cursor .description ]
74- result = cursor .fetchall ()
75-
56+ query = form .cleaned_data ["query" ]
57+ result , headers = form .explain ()
7658 context = {
7759 "result" : result ,
78- "sql" : form . reformat_sql (),
79- "duration" : form . cleaned_data ["duration" ],
60+ "sql" : reformat_sql (query [ "sql" ], with_toggle = False ),
61+ "duration" : query ["duration" ],
8062 "headers" : headers ,
81- "alias" : form . cleaned_data ["alias" ],
63+ "alias" : query ["alias" ],
8264 }
8365 content = render_to_string ("debug_toolbar/panels/sql_explain.html" , context )
8466 return JsonResponse ({"content" : content })
@@ -96,45 +78,25 @@ def sql_profile(request):
9678 form = SQLSelectForm (verified_data )
9779
9880 if form .is_valid ():
99- sql = form .cleaned_data ["raw_sql" ]
100- params = form .cleaned_data ["params" ]
81+ query = form .cleaned_data ["query" ]
10182 result = None
10283 headers = None
10384 result_error = None
104- with form .cursor as cursor :
105- try :
106- cursor .execute ("SET PROFILING=1" ) # Enable profiling
107- cursor .execute (sql , params ) # Execute SELECT
108- cursor .execute ("SET PROFILING=0" ) # Disable profiling
109- # The Query ID should always be 1 here but I'll subselect to get
110- # the last one just in case...
111- cursor .execute (
112- """
113- SELECT *
114- FROM information_schema.profiling
115- WHERE query_id = (
116- SELECT query_id
117- FROM information_schema.profiling
118- ORDER BY query_id DESC
119- LIMIT 1
120- )
121- """
122- )
123- headers = [d [0 ] for d in cursor .description ]
124- result = cursor .fetchall ()
125- except Exception :
126- result_error = (
127- "Profiling is either not available or not supported by your "
128- "database."
129- )
85+ try :
86+ result , headers = form .profile ()
87+ except Exception :
88+ result_error = (
89+ "Profiling is either not available or not supported by your "
90+ "database."
91+ )
13092
13193 context = {
13294 "result" : result ,
13395 "result_error" : result_error ,
13496 "sql" : form .reformat_sql (),
135- "duration" : form . cleaned_data ["duration" ],
97+ "duration" : query ["duration" ],
13698 "headers" : headers ,
137- "alias" : form . cleaned_data ["alias" ],
99+ "alias" : query ["alias" ],
138100 }
139101 content = render_to_string ("debug_toolbar/panels/sql_profile.html" , context )
140102 return JsonResponse ({"content" : content })
0 commit comments