dynamodb PartiQL SELECT 查询 returns ValidationException: 来自源的意外
dynamodb PartiQL SELECT query returns ValidationException: Unexpected from source
我正在使用 Amplify 使用 dynamodb 的放大蓝图设置具有相应 lambda 的 dynamodb。
使用 KeyConditionExpression 等以“经典”方式访问 dynamodb 效果很好,但今天我想尝试使用 PartiQL 代替 executeStatement,但我无法让它工作。
我已将“dynamodb:PartiQLSelect”权限添加到所有其他 dynamodb 权限所在的云端模板,因此它看起来像:
"Action": [
"dynamodb:DescribeTable",
"dynamodb:GetItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem",
"dynamodb:PartiQLSelect"
],
我没有收到任何权限错误,所以我希望这部分没问题,但是 return 即使没有添加该行也会出现同样的错误。
总是 returned 的错误是:
ValidationException: 来自源的意外
不管我怎么试,都无济于事。
到目前为止,我的代码非常基础:
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 的完整错误字符串 return 是:
{
"error": "Could not get users from : habits_sensors-playground =>ValidationException: Unexpected from source"
}
我的 AWS 账户中有 table habits_sensors-playground,我可以毫无问题地以经典方式访问它。这就是为什么“来自源头的意外”令人困惑。我将其解释为指的是 select 查询中的 tableName (in from) 不正确,但该名称与我在 AWS 中的名称匹配,并且它可以使用 documentclient.
非常感谢任何关于错误的建议。
我自己回答,以防其他人出现在这里。
我收到 AWS 的回复,如果 table 名称包含破折号,则在使用 PartiQL 时需要用双引号引用 table 名称(我试过单引号但没有工作)。
也许这会在 PartiQL 的未来版本中改变。
异常 ValidationException: Unexpected from source
(CLI:An error occurred (ValidationException) when calling the ExecuteStatement operation: Unexpected from source
)发生在 table 名称包含破折号且未被引用时。
所以改变
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 中的 table 名称周围添加双引号 "
。
注意 WHERE string='value'
使用单引号 '
而 table 名称需要双引号 "
.
对于像我一样在这里结束的任何其他人,我有一个 powershell 脚本为 aws dynamodb execute-statement (aws --version 2.x) 生成一个语句,并且遇到了同样的错误。太久之后,我尝试了交互式 cli,发现我的查询有效,所以我最终需要做的是为 powershell 目的转义双引号,并再次为 AWS CLI 使用 \ 字符。
$statement = "SELECT id FROM \`"${tablename}\`" WHERE source = '990doc'"
这次双重转义终于让我到达了我需要去的地方,并希望能为其他人省去很多挫折。
为任何人添加此解决方案最终会出现来自 AWS SDK (Javascript) 的此错误。
const { Items = [] } = await dynamodbClient.executeStatement({
Statement: `SELECT * FROM "${tablename}" WHERE "_usedId" IS MISSING`
}).promise();
如上述答案所述,用双引号将 table 名称括起来。
我正在使用 Amplify 使用 dynamodb 的放大蓝图设置具有相应 lambda 的 dynamodb。
使用 KeyConditionExpression 等以“经典”方式访问 dynamodb 效果很好,但今天我想尝试使用 PartiQL 代替 executeStatement,但我无法让它工作。
我已将“dynamodb:PartiQLSelect”权限添加到所有其他 dynamodb 权限所在的云端模板,因此它看起来像:
"Action": [
"dynamodb:DescribeTable",
"dynamodb:GetItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem",
"dynamodb:PartiQLSelect"
],
我没有收到任何权限错误,所以我希望这部分没问题,但是 return 即使没有添加该行也会出现同样的错误。
总是 returned 的错误是: ValidationException: 来自源的意外
不管我怎么试,都无济于事。 到目前为止,我的代码非常基础:
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 的完整错误字符串 return 是:
{
"error": "Could not get users from : habits_sensors-playground =>ValidationException: Unexpected from source"
}
我的 AWS 账户中有 table habits_sensors-playground,我可以毫无问题地以经典方式访问它。这就是为什么“来自源头的意外”令人困惑。我将其解释为指的是 select 查询中的 tableName (in from) 不正确,但该名称与我在 AWS 中的名称匹配,并且它可以使用 documentclient.
非常感谢任何关于错误的建议。
我自己回答,以防其他人出现在这里。
我收到 AWS 的回复,如果 table 名称包含破折号,则在使用 PartiQL 时需要用双引号引用 table 名称(我试过单引号但没有工作)。
也许这会在 PartiQL 的未来版本中改变。
异常 ValidationException: Unexpected from source
(CLI:An error occurred (ValidationException) when calling the ExecuteStatement operation: Unexpected from source
)发生在 table 名称包含破折号且未被引用时。
所以改变
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 中的 table 名称周围添加双引号 "
。
注意 WHERE string='value'
使用单引号 '
而 table 名称需要双引号 "
.
对于像我一样在这里结束的任何其他人,我有一个 powershell 脚本为 aws dynamodb execute-statement (aws --version 2.x) 生成一个语句,并且遇到了同样的错误。太久之后,我尝试了交互式 cli,发现我的查询有效,所以我最终需要做的是为 powershell 目的转义双引号,并再次为 AWS CLI 使用 \ 字符。
$statement = "SELECT id FROM \`"${tablename}\`" WHERE source = '990doc'"
这次双重转义终于让我到达了我需要去的地方,并希望能为其他人省去很多挫折。
为任何人添加此解决方案最终会出现来自 AWS SDK (Javascript) 的此错误。
const { Items = [] } = await dynamodbClient.executeStatement({
Statement: `SELECT * FROM "${tablename}" WHERE "_usedId" IS MISSING`
}).promise();
如上述答案所述,用双引号将 table 名称括起来。