editor php Baicao sedang menunggu panduan pelaksanaan pertanyaan AWS Athena dalam Go SDK, yang direka untuk membantu pembangun mengoptimumkan prestasi pertanyaan dan meningkatkan kelajuan tindak balas aplikasi. AWS Athena ialah perkhidmatan pertanyaan tanpa pelayan yang boleh menjalankan pertanyaan SQL secara langsung dalam baldi S3 tanpa skema atau pemuatan data yang dipratakrifkan. Walau bagaimanapun, disebabkan sifat pelaksanaan tak segerak pertanyaan, pembangun perlu menunggu pertanyaan selesai sebelum mendapatkan keputusan. Panduan ini akan menerangkan cara menggunakan mekanisme tunggu dalam Go SDK untuk menunggu dengan berkesan semasa pelaksanaan pertanyaan dan mendapatkan keputusan selepas pertanyaan selesai, memberikan pengalaman pengguna dan prestasi aplikasi yang lebih baik.
Saya mempunyai kod berfungsi yang menjalankan pertanyaan athena dan menunggu pertanyaan selesai dengan mengundi getqueryresults
返回的 error
menggunakan kod berikut:
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 }
Masalahnya ialah saya sama sekali tidak mempunyai cara untuk memecahkan gelung jika pertanyaan gagal.
Sebagai contoh, dalam python saya boleh melakukan perkara berikut:
while athena.get_query_execution(QueryExecutionId=execution_id)["QueryExecution"][ "Status" ]["State"] in ["RUNNING", "QUEUED"]: sleep(2)
Saya boleh daftar masuk for
循环内进行类似 strings.contains(err.error(),"failed")
tetapi saya sedang mencari cara yang lebih bersih.
Saya cuba mencari yang setara untuk go tetapi tidak berjaya. Adakah terdapat sebarang fungsi dalam go sdk yang boleh mengembalikan status pelaksanaan? Adakah terdapat cara yang lebih baik untuk menyemak ralat dalam go dan bukannya err != nil
?
sdk telah menyediakan fungsi cuba semula.
Ini adalah contoh menggunakan 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 }
Atas ialah kandungan terperinci Menunggu pelaksanaan pertanyaan AWS Athena dalam Go SDK. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!