问题内容
我有一个 AWS Redshift Serverless 数据库,我正在通过 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 的二维数组很难处理。我如何(最好是简单地)将其映射到可用的 JSON,或者说类型结构数组?或者有没有办法从 Redshift 请求 JSON?如果可能的话,我想将所有这些完全保留在我的 Golang 应用程序中。
正确答案
我没有找到官方方法,但下面的方法是通过创建列名称到列值的映射片段,然后从那里进行解组来工作。
// Extracts the column name from column metadata for a given column index
func getColumnName(metadata []types.ColumnMetadata, index int) string {
if index < len(metadata) {
// We assume the metadata is in the same order as the columns in the record.
// If the column name is not set or empty, we can fallback to a default naming convention.
if metadata[index].Name != nil {
return *metadata[index].Name
}
return fmt.Sprintf("column_%d", index)
}
// Fallback if the index is out of range of the metadata slice.
return fmt.Sprintf("unknown_column_%d", index)
}
// Converts query results to JSON bytes for easy unmarshaling to structs
func queryResultsToJSON(query_results *redshiftdata.GetStatementResultOutput) ([]byte, error) {
// Convert the records to a slice of maps for JSON conversion
var records []map[string]interface{}
for _, row := range query_results.Records {
record := make(map[string]interface{})
for idx, col := range row {
// Use the column metadata to determine the name of the column
columnName := getColumnName(query_results.ColumnMetadata, idx)
// Check the type of the value and assign it to the record map
var value interface{}
switch v := col.(type) {
case *types.FieldMemberBlobValue:
value = v.Value
case *types.FieldMemberBooleanValue:
value = v.Value
case *types.FieldMemberDoubleValue:
value = v.Value
case *types.FieldMemberIsNull:
value = nil
case *types.FieldMemberLongValue:
value = v.Value
case *types.FieldMemberStringValue:
value = v.Value
}
record[columnName] = value
}
records = append(records, record)
}
// Marshal the records to JSON
jsonBytes, err := json.Marshal(records)
if err != nil {
log.Error("failed to marshal records to JSON, " + err.Error())
return nil, err
}
return jsonBytes, nil
}
以上就是将 AWS redshiftdataapiservice.GetStatementResultOutput 转换为 JSON 或结构的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容猜你喜欢
AI推送时光机使用泛型将结构转换为映射
后端开发2024-04-04
如何将 TypeScript 接口转换为 Go 结构体?
后端开发2024-02-09
C#中怎么将结构体转换为数组
后端开发2023-06-18
SqlServer中怎么将查询结果转换为XML和JSON
后端开发2024-04-02
SQL Server中怎么将查询结果转换为Json格式
后端开发2024-04-02
使用 Python 将点分隔值转换为 Go 结构
后端开发2024-02-10
将结构体字段切片转换为可变参数
后端开发2024-04-05
怎么在C++中将结构体与Json字符串进行转换
后端开发2023-06-14
abap结构或内表怎么实现与json字符串相互转换.
后端开发2023-06-04
Mysql将查询结果集转换为JSON数据的实例代码
后端开发2024-04-02
将数据从结构 X 复制到结构 Y,但将一个字段转换为不同类型
后端开发2024-04-04
无法根据 Golang 中的条件将接口转换为结构
后端开发2024-04-04
java项目中怎么将数据结构转换为单链表
后端开发2023-05-31
将 parquet 文件转换为带有嵌套元素的 Golang 结构
后端开发2024-02-10
咦!没有更多了?去看看其它编程学习网 内容吧