[英]Wait for AWS Athena query execution in Go SDK
I have a working code that runs an Athena Query and waits for the query to finish by polling the error
return from GetQueryResults
using the following code:我有一个运行 Athena 查询的工作代码,并通过使用以下代码轮询从GetQueryResults
返回的error
来等待查询完成:
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
}
The problem is that in case the query fails, I have absolutely no way to break the loop.问题是万一查询失败,我绝对没有办法打破循环。
For example, in Python I can do something like:例如,在 Python 中,我可以这样做:
while athena.get_query_execution(QueryExecutionId=execution_id)["QueryExecution"][
"Status"
]["State"] in ["RUNNING", "QUEUED"]:
sleep(2)
I can do a check like strings.Contains(err.Error(),"FAILED")
inside the for
loop, but I am looking for a cleaner way.我可以在for
循环中进行类似strings.Contains(err.Error(),"FAILED")
的检查,但我正在寻找一种更简洁的方法。
I tried looking for an equivalent for Go, but I wasn't successful.我尝试寻找 Go 的等价物,但没有成功。 Is there a function for Go SDK that can return the execution status? Go SDK 有没有可以返回执行状态的function? Is there a better way to further examine an error in Go instead of err != nil
?有没有更好的方法来进一步检查 Go 中的错误而不是err != nil
?
The SDK has already provided retries. SDK已经提供重试。
Here is an example for you, using aws-sdk-go-v2.这是一个使用 aws-sdk-go-v2 的示例。
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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.