aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpostal26002010-11-25 01:44:46 -0800
committerRob Hudson2011-01-09 10:18:30 -0800
commita2edb76e8dc900ab5f147e062ceee5ac3ac35a18 (patch)
tree3efd1cd2d6fc3e0209cbc174b772f5082d7bbe8d
parent2f76c21ed607a83c458aa5596be7d114dbd19702 (diff)
downloaddjango-debug-toolbar-a2edb76e8dc900ab5f147e062ceee5ac3ac35a18.tar.bz2
Added support for executemany. Fixes issue #120
Signed-off-by: Rob Hudson <rob@cogit8.org>
-rw-r--r--NEWS2
-rw-r--r--debug_toolbar/panels/sql.py43
2 files changed, 45 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 8729d09..f9b0cf8 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,8 @@ News for django-debug-toolbar
develop branch
--------------
+* Added support for `executemany`. Thanks to postal2600.
+
* Added support for LogBook. Thanks to Vincent Driessen.
* Added clean_params method to DatabaseStatTracker to scrub non-unicode
diff --git a/debug_toolbar/panels/sql.py b/debug_toolbar/panels/sql.py
index 299da66..a3eff49 100644
--- a/debug_toolbar/panels/sql.py
+++ b/debug_toolbar/panels/sql.py
@@ -139,6 +139,49 @@ class DatabaseStatTracker(util.CursorDebugWrapper):
'is_select': sql.lower().strip().startswith('select'),
'template_info': template_info,
})
+
+ def executemany(self, sql, params=()):
+ start = datetime.now()
+ try:
+ return self.cursor.executemany(sql, params)
+ finally:
+ stop = datetime.now()
+ duration = ms_from_timedelta(stop - start)
+ stacktrace = tidy_stacktrace(traceback.extract_stack())
+ _params = ''
+ try:
+ _params = simplejson.dumps([force_unicode(x, strings_only=True) for x in params])
+ except TypeError:
+ pass # object not JSON serializable
+
+ template_info = None
+ cur_frame = sys._getframe().f_back
+ try:
+ while cur_frame is not None:
+ if cur_frame.f_code.co_name == 'render':
+ node = cur_frame.f_locals['self']
+ if isinstance(node, Node):
+ template_info = get_template_info(node.source)
+ break
+ cur_frame = cur_frame.f_back
+ except:
+ pass
+ del cur_frame
+
+ # We keep `sql` to maintain backwards compatibility
+ self.db.queries.append({
+ 'sql': self.db.ops.last_executed_query(self.cursor, sql, params),
+ 'duration': duration,
+ 'raw_sql': sql,
+ 'params': _params,
+ 'hash': sha_constructor(settings.SECRET_KEY + sql + _params).hexdigest(),
+ 'stacktrace': stacktrace,
+ 'start_time': start,
+ 'stop_time': stop,
+ 'is_slow': (duration > SQL_WARNING_THRESHOLD),
+ 'is_select': sql.lower().strip().startswith('select'),
+ 'template_info': template_info,
+ })
util.CursorDebugWrapper = DatabaseStatTracker
class SQLDebugPanel(DebugPanel):