【问题标题】:dynamodb PartiQL SELECT query returns ValidationException: Unexpected from sourcedynamodb PartiQL SELECT 查询返回 ValidationException: Unexpected from source
【发布时间】:2021-01-25 16:12:22
【问题描述】:

我正在使用 Amplify 使用 dynamodb 的放大蓝图来设置具有相应 lambda 的 dynamodb。

使用 KeyConditionExpression 等以“经典”方式访问 dynamodb 效果很好,但今天我想尝试使用 PartiQL 来代替 executeStatement,但我无法让它工作。

我已将“dynamodb:PartiQLSelect”权限添加到所有其他 dynamodb 权限所在的 cloudfront 模板中,如下所示:

 "Action": [
                "dynamodb:DescribeTable",
                "dynamodb:GetItem",
                "dynamodb:Query",
                "dynamodb:Scan",
                "dynamodb:PutItem",
                "dynamodb:UpdateItem",
                "dynamodb:DeleteItem",
                "dynamodb:PartiQLSelect"
              ],

我没有收到任何权限错误,所以我希望那部分没问题,但是即使没有添加该行,它也会返回相同的错误。

总是返回的错误是: ValidationException: Unexpected from source"

无论我尝试过什么,都无济于事。 到目前为止,我的代码非常基本:

const dynamodb2 = new AWS.DynamoDB();

let tableName = "habits_sensors";
if(process.env.ENV && process.env.ENV !== "NONE") {
  tableName = tableName + '-' + process.env.ENV;
}

app.get(path, function(req, res) {
  let params = {
    Statement: `select * from ${tableName}`
  };

  dynamodb2.executeStatement(params, (err, data) => {
    if (err) {
      res.statusCode = 500;
      res.json({error: `Could not get users from : ${tableName} =>` + err});
    } else {
      res.json(data.Items);
    }
  });
});

从 lambda 返回的完整错误字符串是:

{
    "error": "Could not get users from : habits_sensors-playground =>ValidationException: Unexpected from source"
}

并且我的 AWS 账户中有表habits_sensors-playground,我可以通过经典方式毫无问题地访问它。这就是为什么“来自源头的意外”令人困惑的原因。我将其解释为指选择查询中的 tableName (in from) 不正确,但名称与我在 AWS 中的名称匹配,并且它使用 documentclient 工作。

非常感谢任何关于可能出错的建议。

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb aws-amplify dynamodb-queries partiql


    【解决方案1】:

    回答自己以防其他人在这里结束。

    我收到 AWS 的回复,如果表名包含破折号,则在使用 PartiQL 时需要用双引号将表名括起来(我曾尝试过单引号,但不起作用)。

    也许这会在 PartiQL 的未来版本中发生变化。

    【讨论】:

    • 甚至在 noSQL Workbench 中
    【解决方案2】:

    异常ValidationException: Unexpected from source(CLI:An error occurred (ValidationException) when calling the ExecuteStatement operation: Unexpected from source)发生在表名包含破折号且未引用时。

    所以改变

    aws dynamodb execute-statement --statement "SELECT * FROM my-table WHERE field='string'"
    

    收件人:

    aws dynamodb execute-statement --statement "SELECT * FROM \"my-table\" WHERE field='string'"
    

    或在您用于使用 PartiQL 的 SDK 中的表名周围添加双引号 "

    注意WHERE string='value'使用单引号',表名需要双引号"

    【讨论】:

      【解决方案3】:

      对于像我一样在这里结束的其他人,我有一个 powershell 脚本为 aws dynamodb execute-statement (aws --version 2.x) 生成一个语句,并且遇到了同样的错误。太久之后,我尝试了交互式 cli,发现我的查询有效,所以我最终需要做的是为 powershell 目的转义双引号,并再次为 AWS CLI 使用 \ 字符。

      $statement = "SELECT id FROM \`"${tablename}\`" WHERE source = '990doc'" 
      

      这种双重逃避终于把我带到了我需要去的地方,并有望为其他人节省很多挫败感。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-29
        • 1970-01-01
        • 2021-05-12
        • 1970-01-01
        • 1970-01-01
        • 2014-10-31
        • 2019-11-26
        相关资源
        最近更新 更多