def handle_query_error( ex: Exception, query: Query, session: Session, payload: Optional[Dict[str, Any]] = None, prefix_message: str = "", ) -> Dict[str, Any]: """Local method handling error while processing the SQL""" payload = payload or {} msg = f"{prefix_message} {str(ex)}".strip() troubleshooting_link = config["TROUBLESHOOTING_LINK"] query.error_message = msg query.status = QueryStatus.FAILED query.tmp_table_name = None # extract DB-specific errors (invalid column, eg) if isinstance(ex, SupersetErrorException): errors = [ex.error] elif isinstance(ex, SupersetErrorsException): errors = ex.errors else: errors = query.database.db_engine_spec.extract_errors(str(ex)) errors_payload = [dataclasses.asdict(error) for error in errors] if errors: query.set_extra_json_key("errors", errors_payload) session.commit() payload.update({"status": query.status, "error": msg, "errors": errors_payload}) if troubleshooting_link: payload["link"] = troubleshooting_link return payload
def handle_query_error( msg: str, query: Query, session: Session, payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: """Local method handling error while processing the SQL""" payload = payload or {} troubleshooting_link = config["TROUBLESHOOTING_LINK"] query.error_message = msg query.status = QueryStatus.FAILED query.tmp_table_name = None # extract DB-specific errors (invalid column, eg) errors = [ dataclasses.asdict(error) for error in query.database.db_engine_spec.extract_errors(msg) ] if errors: query.set_extra_json_key("errors", errors) session.commit() payload.update({"status": query.status, "error": msg, "errors": errors}) if troubleshooting_link: payload["link"] = troubleshooting_link return payload
def handle_cursor(cls, cursor: Cursor, query: Query, session: Session) -> None: tracking_url = cls.get_tracking_url(cursor) if tracking_url: query.tracking_url = tracking_url # Adds the executed query id to the extra payload so the query can be cancelled query.set_extra_json_key("cancel_query", cursor.stats["queryId"]) session.commit() BaseEngineSpec.handle_cursor(cursor=cursor, query=query, session=session)
def save_metadata(query: Query, payload: Dict[str, Any]) -> None: # pull relevant data from payload and store in extra_json columns = payload.get("columns", {}) db.session.add(query) query.set_extra_json_key("columns", columns)