首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Go SDK中等待AWS雅典娜查询的执行

在Go SDK中等待AWS雅典娜查询的执行
EN

Stack Overflow用户
提问于 2022-11-25 17:19:42
回答 1查看 40关注 0票数 1

我有一个运行雅典娜查询的工作代码,并通过使用以下代码轮询来自errorGetQueryResults返回来等待查询完成:

代码语言:javascript
运行
复制
func GetQueryResults(client *athena.Client, QueryID *string) []types.Row {

    params := &athena.GetQueryResultsInput{
        QueryExecutionId: QueryID,
    }

    data, err := client.GetQueryResults(context.TODO(), params)

    for err != nil {
        println(err.Error())
        time.Sleep(time.Second)
        data, err = client.GetQueryResults(context.TODO(), params)
    }

    return data.ResultSet.Rows
}

问题是,如果查询失败,我绝对没有办法中断循环。

例如,在Python中,我可以执行如下操作:

代码语言:javascript
运行
复制
    while athena.get_query_execution(QueryExecutionId=execution_id)["QueryExecution"][
        "Status"
    ]["State"] in ["RUNNING", "QUEUED"]:
        sleep(2)

我可以在strings.Contains(err.Error(),"FAILED")循环中进行类似于for的检查,但我正在寻找一种更干净的方法。

我试着找一个对等的围棋,但我没有成功。Go SDK是否有一个函数可以返回执行状态?是否有更好的方法来进一步检查Go中的错误而不是err != nil

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-26 17:46:33

SDK已经提供了重试。

下面是一个使用aws-sdk-go-v2的示例。

代码语言:javascript
运行
复制
package main

import (
    "context"
    "fmt"
    "time"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/service/athena"
    "github.com/aws/aws-sdk-go-v2/service/athena/types"
)

func main() {
    cfg := aws.NewConfig()
    ath := athena.NewFromConfig(*cfg)

    ctx, cancelFunc := context.WithTimeout(context.Background(), time.Minute*5)
    defer cancelFunc()

    rows, err := GetQueryResults(ctx, ath, aws.String("query-id"), 10)
    if err != nil {
        panic(err) // TODO: handle error
    }

    fmt.Println(rows)
}

func GetQueryResults(ctx context.Context, client *athena.Client, QueryID *string, attempts int) ([]types.Row, error) {
    t := time.NewTicker(time.Second * 5)
    defer t.Stop()

    attemptsFunc := func(o *athena.Options) { o.RetryMaxAttempts = attempts }

WAIT:
    for {
        select {
        case <-t.C:
            out, err := client.GetQueryExecution(ctx, &athena.GetQueryExecutionInput{
                QueryExecutionId: QueryID,
            }, attemptsFunc)
            if err != nil {
                return nil, err
            }

            switch out.QueryExecution.Status.State {
            case types.QueryExecutionStateCancelled,
                types.QueryExecutionStateFailed,
                types.QueryExecutionStateSucceeded:
                break WAIT
            }

        case <-ctx.Done():
            break WAIT
        }
    }

    data, err := client.GetQueryResults(ctx, &athena.GetQueryResultsInput{
        QueryExecutionId: QueryID,
    })
    if err != nil {
        return nil, err
    }

    return data.ResultSet.Rows, nil
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74576109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档