我的编程空间,编程开发者的网络收藏夹
学习永远不晚

将 AWS redshiftdataapiservice.GetStatementResultOutput 转换为 JSON 或结构

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

将 AWS redshiftdataapiservice.GetStatementResultOutput 转换为 JSON 或结构

问题内容

我有一个 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
}

我发现 *Fields 的二维数组很难处理。我如何(最好是简单地)将其映射到可用的 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

将 AWS redshiftdataapiservice.GetStatementResultOutput 转换为 JSON 或结构

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

将 AWS redshiftdataapiservice.GetStatementResultOutput 转换为 JSON 或结构

问题内容我有一个 AWS Redshift Serverless 数据库,我正在通过 AWS Go SDK 的 redshiftdataapiservice 查询该数据库。查询和所有这些都有效,但记录以难以使用/理解的格式返回。我的代码
将 AWS redshiftdataapiservice.GetStatementResultOutput 转换为 JSON 或结构
2024-02-06

使用泛型将结构转换为映射

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《使用泛型将结构转换为映射》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~问题
使用泛型将结构转换为映射
2024-04-04

如何将 TypeScript 接口转换为 Go 结构体?

php小编新一为您介绍如何将 TypeScript 接口转换为 Go 结构体。当我们在前端使用 TypeScript 开发时,经常会定义接口来描述数据结构。而在后端使用 Go 语言开发时,需要将这些接口转换为对应的结构体。本文将从基本类型、
如何将 TypeScript 接口转换为 Go 结构体?
2024-02-09

C#中怎么将结构体转换为数组

本篇文章给大家分享的是有关C#中怎么将结构体转换为数组,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。(1)解决C#结构体数组间的转化之定义结构体://命名空间 using S
2023-06-18

如何使用golang中的json.Marshal函数将结构体转换为JSON字符串

如何使用golang中的json.Marshal函数将结构体转换为JSON字符串在现代软件开发中,数据的传输和存储往往使用JSON(JavaScript Object Notation)格式。在Go语言中,我们可以使用json.Marsha
如何使用golang中的json.Marshal函数将结构体转换为JSON字符串
2023-11-18

使用 Python 将点分隔值转换为 Go 结构

php小编柚子在本文中将介绍如何使用Python将点分隔值(如"key1.subkey1.subkey2")转换为Go语言中的结构体。这个转换过程对于从配置文件或API响应中提取和处理数据非常有用。我们将使用Python的递归函数和Go语言
使用 Python 将点分隔值转换为 Go 结构
2024-02-10

将结构体字段切片转换为可变参数

编程网今天将给大家带来《将结构体字段切片转换为可变参数》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!问题内容我的应用
将结构体字段切片转换为可变参数
2024-04-05

怎么在C++中将结构体与Json字符串进行转换

本篇文章给大家分享的是有关怎么在C++中将结构体与Json字符串进行转换,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。type Person struct { Name str
2023-06-14

使用golang中的json.MarshalIndent函数将结构体转换为格式化的JSON字符串

使用golang中的json.MarshalIndent函数将结构体转换为格式化的JSON字符串在使用Golang编写程序时,我们经常需要将结构体转换为JSON字符串,在这个过程中,json.MarshalIndent函数可以帮助我们实现格
使用golang中的json.MarshalIndent函数将结构体转换为格式化的JSON字符串
2023-11-18

abap结构或内表怎么实现与json字符串相互转换.

本篇内容介绍了“abap结构或内表怎么实现与json字符串相互转换.”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!可使用的类有很多,如cl_
2023-06-04

使用 unsafe.Pointer 直接将结构“point”转换为另一个结构是否安全?

在Go语言中,使用`unsafe.Pointer`可以直接将一个结构体转换为另一个结构体。然而,这种转换是否安全是一个值得讨论的问题。在使用`unsafe.Pointer`进行结构体转换时,必须非常小心,因为它可能导致内存访问错误或数据损坏
使用 unsafe.Pointer 直接将结构“point”转换为另一个结构是否安全?
2024-02-09

使用PHP的json_encode()函数将数组或对象转换为JSON字符串

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,已经成为Web应用程序之间数据交换的常用格式。PHP的json_encode()函数可以将数组或对象转换为JSON字符串。本文将介绍如何使用PHP的
使用PHP的json_encode()函数将数组或对象转换为JSON字符串
2023-11-03

将数据从结构 X 复制到结构 Y,但将一个字段转换为不同类型

编程网今天将给大家带来《将数据从结构 X 复制到结构 Y,但将一个字段转换为不同类型》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望
将数据从结构 X 复制到结构 Y,但将一个字段转换为不同类型
2024-04-04

在 Go 中将 Excel 文件数据转换为 JSON 字符串,无需任何结构体定义

问题内容我是 go 语言新手。我有一个要求,应用程序将读取 excel 文件并将其转换为 json 字符串,而不依赖于任何定义的结构。我探索了一些库,其中要么需要此结构定义,要么至少必须有 excel 列标题。例如,github.com
在 Go 中将 Excel 文件数据转换为 JSON 字符串,无需任何结构体定义
2024-02-06

无法根据 Golang 中的条件将接口转换为结构

目前编程网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《无法根据 Golang 中的条件将接口转换为结构》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评
无法根据 Golang 中的条件将接口转换为结构
2024-04-04

java项目中怎么将数据结构转换为单链表

java项目中怎么将数据结构转换为单链表?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 单链表实现链表的打印及元素删除操作,链表的实现主要是next属性的定义,将一堆节
2023-05-31

将 parquet 文件转换为带有嵌套元素的 Golang 结构

php小编新一将介绍如何将 parquet 文件转换为带有嵌套元素的 Golang 结构。Parquet 是一种高效的列式存储格式,而 Golang 是一种强大的编程语言,将它们结合起来可以帮助我们更好地处理和分析大量的数据。通过使用适当的
将 parquet 文件转换为带有嵌套元素的 Golang 结构
2024-02-10

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录