diff options
| author | postal2600 | 2010-11-25 01:44:46 -0800 | 
|---|---|---|
| committer | Rob Hudson | 2011-01-09 10:18:30 -0800 | 
| commit | a2edb76e8dc900ab5f147e062ceee5ac3ac35a18 (patch) | |
| tree | 3efd1cd2d6fc3e0209cbc174b772f5082d7bbe8d | |
| parent | 2f76c21ed607a83c458aa5596be7d114dbd19702 (diff) | |
| download | django-debug-toolbar-a2edb76e8dc900ab5f147e062ceee5ac3ac35a18.tar.bz2 | |
Added support for executemany. Fixes issue #120
Signed-off-by: Rob Hudson <rob@cogit8.org>
| -rw-r--r-- | NEWS | 2 | ||||
| -rw-r--r-- | debug_toolbar/panels/sql.py | 43 | 
2 files changed, 45 insertions, 0 deletions
| @@ -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): | 
