getredash/redash · error · Exception

No cached result available for query {}.

Error message

No cached result available for query {}.

What it means

Raised by get_query_results (redash/query_runner/query_results.py:72) when bring_from_cache is true but the query has never produced a result — query.latest_query_data_id is None, so there is no cached QueryResult to return. The cached path intentionally never executes the underlying query.

Source

Thrown at redash/query_runner/query_results.py:72

        raise PermissionError("You do not have access to query id {}.".format(query.id))

    return query


def replace_query_parameters(query_text, params):
    qs = parse_qs(params)
    for key, value in qs.items():
        query_text = query_text.replace("{{{{{my_key}}}}}".format(my_key=key), value[0])
    return query_text


def get_query_results(user, query_id, bring_from_cache, params=None):
    query = _load_query(user, query_id)
    if bring_from_cache:
        if query.latest_query_data_id is not None:
            results = query.latest_query_data.data
        else:
            raise Exception("No cached result available for query {}.".format(query.id))
    else:
        query_text = query.query_text
        if params is not None:
            query_text = replace_query_parameters(query_text, params)

        results, error = query.data_source.query_runner.run_query(query_text, user)
        if error:
            raise Exception("Failed loading results for query id {}.".format(query.id))

    return results


def create_tables_from_query_ids(user, connection, query_ids, query_params, cached_query_ids=[]):
    for query_id in set(cached_query_ids):
        results = get_query_results(user, query_id, True)
        table_name = "cached_query_{query_id}".format(query_id=query_id)
        create_table(connection, table_name, results)

View on GitHub (pinned to ca79fe988d)

Solutions

  1. Run the source query once successfully in the Redash UI so a cached result exists, then retry with bring_from_cache
  2. Pass bring_from_cache=False (omit the id from cached_query_ids) so the runner executes the query live
  3. If the result was deleted by retention/cleanup, re-execute the query and consider a longer result retention setting

Example fix

# before
results = get_query_results(user, qid, bring_from_cache=True)  # fails if never run
# after
results = get_query_results(user, qid, bring_from_cache=query.latest_query_data_id is not None)
Defensive patterns

Strategy: fallback

Validate before calling

query = models.Query.get_by_id(query_id)
use_cache = bring_from_cache and query.latest_query_data_id is not None
results = get_query_results(user, query_id, use_cache)

Try / catch

try:
    results = get_query_results(user, qid, True)
except Exception as e:
    if 'No cached result' in str(e):
        results = get_query_results(user, qid, False)  # execute live
    else:
        raise

Prevention

When it happens

Trigger: Calling get_query_results(user, query_id, bring_from_cache=True) (or in Python queries, adding the query id to the cached_query_ids argument) for a query that has not been run successfully yet, or whose results were deleted/archived.

Common situations: Newly created queries referenced by the results-loader before their first execution; cached results expired and were cleaned up by the periodic job; queries whose last run failed so latest_query_data was never set.

Related errors


AI-assisted analysis of getredash/redash@ca79fe988d (2026-08-28). Data as JSON: /api/errors/82893bd1b1e01b1b. Report an issue: GitHub.