def sql_explain(): statement = request.args['sql'] params = request.args['params'] # Validate hash hash = hashlib.sha1( current_app.config['SECRET_KEY'] + statement + params).hexdigest() if hash != request.args['hash']: return abort(406) # Make sure it is a select statement if not statement.lower().strip().startswith('select'): return abort(406) params = json.loads(params) # engine = SQLAlchemy().get_engine(current_app) from app.models import engine if engine.driver == 'pysqlite': query = 'EXPLAIN QUERY PLAN %s' % statement else: query = 'EXPLAIN %s' % statement result = engine.execute(query, params) return g.debug_toolbar.render('panels/sqlalchemy_explain.html', { 'result': result.fetchall(), 'headers': result.keys(), 'sql': format_sql(statement, params), 'duration': float(request.args['duration']), })
def content(self): if not json_available or not sqlalchemy_available: msg = ['Missing required libraries:', '<ul>'] if not json_available: msg.append('<li>simplejson</li>') if not sqlalchemy_available: msg.append('<li>Shimehari-SQLAlchemy</li>') msg.append('</ul>') return '\n'.join(msg) queries = get_debug_queries() data = [] for query in queries: is_select = query.statement.strip().lower().startswith('select') _params = '' try: _params = json.dumps(query.parameters) except TypeError: pass # object not JSON serializable hash = hashlib.sha1( current_app.config['SECRET_KEY'] + query.statement + _params).hexdigest() data.append({ 'duration': query.duration, 'sql': format_sql(query.statement, query.parameters), 'raw_sql': query.statement, 'hash': hash, 'params': _params, 'is_select': is_select, 'context_long': query.context, 'context': format_fname(query.context) }) return self.render('panels/sqlalchemy.html', { 'queries': data})