From b5e330d10071a320f3eff6973b481df602f61337 Mon Sep 17 00:00:00 2001 From: Vera Liu Date: Mon, 13 Feb 2017 11:20:34 -0800 Subject: [PATCH 1/2] Better error handling for presto --- superset/sql_lab.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/superset/sql_lab.py b/superset/sql_lab.py index 588d556f28abe..fc9eb647bfad4 100644 --- a/superset/sql_lab.py +++ b/superset/sql_lab.py @@ -108,6 +108,15 @@ def handle_error(msg): result_proxy = engine.execute(query.executed_sql, schema=query.schema) except Exception as e: logging.exception(e) + if hasattr(e, 'orig') \ + and type(e.orig).__name__ == 'DatabaseError' \ + and isinstance(e.orig[0], dict): + error_dict = e.orig[0] + e = '{} at {}: {}'.format( + error_dict['errorName'], + error_dict['errorLocation'], + error_dict['message'] + ) handle_error(utils.error_msg_from_exception(e)) cursor = result_proxy.cursor From e2c73636fc01095de2c3cf7bdf062c910168750c Mon Sep 17 00:00:00 2001 From: Vera Liu Date: Wed, 15 Feb 2017 10:38:58 -0800 Subject: [PATCH 2/2] Move to db_engine_spec --- superset/db_engine_specs.py | 20 ++++++++++++++++++++ superset/sql_lab.py | 11 +---------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/superset/db_engine_specs.py b/superset/db_engine_specs.py index 60d43bc8a7820..59ad5ed29ae56 100644 --- a/superset/db_engine_specs.py +++ b/superset/db_engine_specs.py @@ -18,6 +18,8 @@ from collections import namedtuple, defaultdict from flask_babel import lazy_gettext as _ +from superset import utils + import inspect import textwrap import time @@ -91,6 +93,11 @@ def handle_cursor(cls, cursor, query, session): query object""" pass + @classmethod + def extract_error_message(cls, e): + """Extract error message for queries""" + return utils.error_msg_from_exception(e) + @classmethod def sql_preprocessor(cls, sql): """If the SQL needs to be altered prior to running it @@ -312,6 +319,19 @@ def handle_cursor(cls, cursor, query, session): time.sleep(1) polled = cursor.poll() + @classmethod + def extract_error_message(cls, e): + if hasattr(e, 'orig') \ + and type(e.orig).__name__ == 'DatabaseError' \ + and isinstance(e.orig[0], dict): + error_dict = e.orig[0] + e = '{} at {}: {}'.format( + error_dict['errorName'], + error_dict['errorLocation'], + error_dict['message'] + ) + return utils.error_msg_from_exception(e) + class MssqlEngineSpec(BaseEngineSpec): engine = 'mssql' diff --git a/superset/sql_lab.py b/superset/sql_lab.py index fc9eb647bfad4..8b57901f9a445 100644 --- a/superset/sql_lab.py +++ b/superset/sql_lab.py @@ -108,16 +108,7 @@ def handle_error(msg): result_proxy = engine.execute(query.executed_sql, schema=query.schema) except Exception as e: logging.exception(e) - if hasattr(e, 'orig') \ - and type(e.orig).__name__ == 'DatabaseError' \ - and isinstance(e.orig[0], dict): - error_dict = e.orig[0] - e = '{} at {}: {}'.format( - error_dict['errorName'], - error_dict['errorLocation'], - error_dict['message'] - ) - handle_error(utils.error_msg_from_exception(e)) + handle_error(db_engine_spec.extract_error_message(e)) cursor = result_proxy.cursor query.status = QueryStatus.RUNNING