DynamoDb删除不存在的项目不会失败,为什么?

Man*_*gni 6 amazon-web-services amazon-dynamodb

我正在从dynamodb表中删除一个dynamoDbMapper.delete(object)使用默认DynamoDBDeleteExpression 的不存在的记录

我期待出现某种异常,因为数据库中没有记录,但它什么也没做.它甚至没有返回类型,可以判断删除是成功还是失败.有没有办法添加一个删除表达式或某些东西,如果该项目不在数据库中,我的删除会抛出异常?

E.J*_*nan 10

它是按设计:

除非您指定条件,否则DeleteItem是幂等操作; 在同一项或属性上多次运行它不会导致错误响应.

来自:https: //docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html

  • @ManthanJamdagni 你不会改用attribute_exists() 因为你只希望在属性存在的情况下进行删除,如果不存在则失败,正如OP所说的那样? (4认同)
  • 是的,您可以使用条件表达式来实现 - aws dynamodb delete-item \ --table-name ProductCatalog \ --key '{"Id": {"N": "id123"}}' \ --condition-expression "属性不存在(价格)” (2认同)

Zhe*_*nya 6

可以利用 ReturnValues 来确定 delete 是否做了任何事情。如果ReturnValues.Attributes为空,则表示delete没有找到要删除的记录,此时可以抛出错误。JavaScript 中的示例:

async function deleteWithThrowIfNotExists() {
  const dynamo = new AWS.DynamoDB.DocumentClient();
  const parameters = {
    Key: {
      user: 'john'
    },
    ReturnValues: 'ALL_OLD',
    TableName: 'users'
  };
  const response = await dynamo.delete(parameters).promise();
  if (!response.Attributes) {
    throw new Error('Cannot delete item that does not exist')
  }
}
Run Code Online (Sandbox Code Playgroud)