我有一个AWS Redshift无服务器数据库,我正在通过AWS Go SDK的redshiftdataapiservice
进行查询。查询和所有工作,但记录以难以使用/理解的格式返回。
我的代码是这样的:
import (
"fmt"
"log"
"time"
"os"
"context"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/redshiftdata"
"github.com/aws/aws-sdk-go-v2/service/redshiftdata/types"
)
// Execute a Redshift query and return a result statement output
func executeRedshiftQuery(sql string) (*redshiftdata.GetStatementResultOutput, error) {
// Load the Shared AWS Configuration (~/.aws/config)
cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion(os.Getenv("AWS_REGION")))
if err != nil {
return nil, err
}
// Create a service client
redshiftclient := redshiftdata.NewFromConfig(cfg)
execStmt, err := redshiftclient.ExecuteStatement(context.TODO(), &redshiftdata.ExecuteStatementInput{
WorkgroupName: aws.String(os.Getenv("WG_NAME")),
Database: aws.String(os.Getenv("DB_NAME")),
Sql: aws.String(sql),
})
if err != nil {
return nil, err
}
// wait for query to finish
for {
descStmt, err := redshiftclient.DescribeStatement(context.TODO(), &redshiftdata.DescribeStatementInput{
Id: execStmt.Id,
})
if err != nil {
return nil, err
}
// return an error if the query failed or aborted
if descStmt.Status == types.StatusStringFailed || descStmt.Status == types.StatusStringAborted {
err := errors.New("the Redshift query failed or was aborted")
return nil, err
} else if descStmt.Status != types.StatusStringFinished {
time.Sleep(1 * time.Second)
continue
}
break
}
// get the results
resultStmt, err := redshiftclient.GetStatementResult(context.TODO(), &redshiftdata.GetStatementResultInput{
Id: execStmt.Id,
})
if err != nil {
return nil, err
}
return resultStmt, nil
}
字符串*Field
s的2D数组是我发现很难处理的。我如何(最好是容易地)将其Map到可用的JSON,或者说是一个类型结构的数组?或者有没有一种方法可以从Redshift请求JSON?如果可能的话,我想将所有这些完全保留在我的Golang应用程序中。
1条答案
按热度按时间ehxuflar1#
我没有找到正式的方法,但下面的工作原理是创建列名到列值的Map切片,然后从那里解组。
字符串