AWS RDS Data API executeStatement 不返回列名

niq*_*qui 16 amazon-web-services amazon-aurora aws-rds-data-service

我正在使用适用于 Amazon Aurora Serverless新数据 API

是否可以在响应中获取表列名称?

例如,如果我在包含列, , , ,的用户表中运行以下查询:idfirst_namelast_nameemailphone

const sqlStatement = `
    SELECT *
    FROM user
    WHERE id = :id 
`;
const params = {
    secretArn: <mySecretArn>,
    resourceArn: <myResourceArn>,
    database: <myDatabase>,
    sql: sqlStatement,
    parameters: [
        {
            name: "id",
            value: {
                "stringValue": 1
            }
        }
    ]
};
let res = await this.RDS.executeStatement(params)
console.log(res);
Run Code Online (Sandbox Code Playgroud)

我收到了这样的回复,所以我需要猜测哪个列对应于每个值:

{
    "numberOfRecordsUpdated": 0,
    "records": [
        [
            {
                "longValue": 1
            },
            {
                "stringValue": "Nicolas"
            },
            {
                "stringValue": "Perez"
            },
            {
                "stringValue": "example@example.com"
            },
            {
                "isNull": true
            }
        ]
    ]
}
Run Code Online (Sandbox Code Playgroud)

我想得到这样的回应:

{
    id: 1,
    first_name: "Nicolas",
    last_name: "Perez",
    email: "example@example.com",
    phone: null
}
Run Code Online (Sandbox Code Playgroud)

更新1

我找到了一个npm 模块,它封装了 Aurora Serverless Data API 并简化了开发

Ara*_*ndR 8

我们决定采用当前的方法,因为我们试图减少响应大小,并且在每条记录中包含列信息是多余的。

您可以明确选择在结果中包含列元数据。请参阅参数:“includeResultMetadata”。

https://docs.aws.amazon.com/rdsdataservice/latest/APIReference/API_ExecuteStatement.html#API_ExecuteStatement_RequestSyntax

  • 这没有多大意义。API 的使用者*不需要*需要返回数据的列名的可能性有多大?虽然有些用例不需要列名 - 我认为您正在针对不太可能的情况进行优化。 (13认同)
  • 如果我们“includeResultMetadata”并循环遍历每个记录值,该值的索引是否始终与ColumnMetadata的索引匹配?我正在使用 Data API 和 Golang 努力解决同样的问题,并且很惊讶没有更简单的方法将键-&gt;值绑定到结构。需要做更多的工作。 (6认同)
  • 我必须同意之前的评论者的观点,即不包含列名称非常不方便。我们应该如何绘制响应图?我们是否只是假设返回值的索引始终保持相同的顺序?这方面的文档在哪里?另外,我看不出排除名称有多大好处,因为您仍然包含每个返回值的列类型,例如“stringValue”。似乎在响应中包含列名称并在 ResultMetadata 中包含列类型更有意义。我们至少可以得到一个名称的配置标志吗? (5认同)
  • 整个 rdsdataapi 看起来像是在 24 小时黑客马拉松之类​​的活动中拼凑而成的。亚马逊希望将其作为无服务器 mysql 服务器的标准来出售,但它的 API 让它看起来甚至无法扩展到测试之外,更不用说在生产应用程序中使用了。每件事都成为障碍,对极光缺乏支持感到非常失望。 (4认同)

小智 6

同意这里的共识,即应该有一种开箱即用的方式从数据服务 API 中做到这一点。因为没有,这里有一个 JavaScript 函数来解析响应。

const parseDataServiceResponse = res => {
    let columns = res.columnMetadata.map(c => c.name);
    let data = res.records.map(r => {
        let obj = {};
        r.map((v, i) => {
            obj[columns[i]] = Object.values(v)[0]
        });
        return obj
    })
    return data
}
Run Code Online (Sandbox Code Playgroud)