amazon-dynamodb - DynamoDb PutItem 似乎正确,但 ValidationException: The provided key element does not match the schema
问题描述
我知道以前有人问过这个问题,并且根据这些答案,我很确定我所拥有的是正确的。在这一点上,老实说,我觉得我错过了一些超级基本的东西。
DynamoDB 连接器已设置:
const AWS = require('aws-sdk');
// set up dynamoDB
const dynamoDb = new AWS.DynamoDB.DocumentClient();
我已经用无服务器中的键定义了一个 DynamoDB 表,如下所示:
CampaignStreamDynamoDbTable:
Type: 'AWS::DynamoDB::Table'
DeletionPolicy: Retain
Properties:
ProvisionedThroughput:
ReadCapacityUnits: 5
WriteCapacityUnits: 5
AttributeDefinitions:
- AttributeName: "id"
AttributeType: "S"
- AttributeName: "campaign_id"
AttributeType: "S"
KeySchema:
- AttributeName: "id"
KeyType: "HASH"
- AttributeName: "campaign_id"
KeyType: "RANGE"
StreamSpecification:
StreamViewType: "NEW_AND_OLD_IMAGES"
TableName: ${self:provider.environment.FS_CAMPAIGN_STREAM_TABLE}
我有一个函数可以更新包含主键和范围键的表(第三个参数是我更新测试的状态):
let update_test_status = async (test_id, campaign_key, test_status) => {
console.info("Updating bulk test " + test_id + " with campaign_key "+campaign_key+" to " + test_status);
let b = true;
const timestamp = new Date().getTime();
const update_params = {
TableName: process.env.FS_CAMPAIGN_STREAM_TABLE,
Key: {
id: test_id,
campaign_key: campaign_key
},
ProjectionExpression: "#s",
ExpressionAttributeNames: {"#s": "status"},
UpdateExpression: "set #s=:s, updated_at=:u",
ExpressionAttributeValues: {
":s": test_status,
":u": timestamp,
},
ReturnValues: "UPDATED_NEW"
};
try {
let results = await dynamoDb.update(update_params).promise();
} catch (error) {
console.error("Could not update the record: " + error);
test_status = "error";
console.error("Links processed, but error updating record in DB");
b = false;
}
return b;
};
try {
let results = await dynamoDb.update(update_params).promise();
} catch (error) {
console.error("Could not update the record: " + error);
test_status = "error";
console.error("Links processed, but error updating record in DB");
b = false;
}
return b;
};
我这样称呼这个函数:
await update_test_status(item.id.S, item.campaign_key.S, "processing")
item 是 DynamoDB 记录
笔记:
我已经验证了 id 和 key 都被传递给了 update 方法。我已经尝试过带引号和不带引号的 KEY 参数
解决方案
在您的表定义中,您调用了它,campaign_id
但稍后在您的代码中调用了它campaign_key
。
看到错误时,您应该始终双重(和三重)检查哈希和范围键的名称和类型是否与定义中的相同。
推荐阅读
- java - 为什么我的 char taxGroup 变量没有在 taxGroup 方法中更新?
- php - 当 $request->validate 失败时,Laravel 抛出 404
- docker - 使用来自 git 的 Python 包进行 docker-compose 后没有模块错误
- python - 用 open() 连接字符串作为行
- excel - 在 Open Office Calc 中运行 VBA 宏
- core-data - 是否可以在 SwiftUI 的 Scene Delegate 中为核心数据实体创建 Fetch Request
- python - 在文本文件中搜索 Word 并用字典中的值替换,仅一次
- python - Python Selenium Webdriver ActionChains 似乎无法以任何方式工作
- delphi - 如何附加到 Tstringlist 中的给定字符串
- sql-server - 如何向 Azure SQL Server 实例验证具有托管标识的 Azure Function 应用