예제 #1
0
파일: sql_lab.py 프로젝트: swaitw/superset
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
예제 #2
0
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
예제 #3
0
    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)
예제 #4
0
 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)