【问题标题】:DynamoDb delete non-existent item does not fail, why?DynamoDb 删除不存在的项目不会失败,为什么?
【发布时间】:2018-09-27 01:23:19
【问题描述】:

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

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

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb


    【解决方案1】:

    可以使用 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')
      }
    }
    

    【讨论】:

      【解决方案2】:

      你可以先加载item,如果item不存在你可以抛出异常,否则删除它。

      【讨论】:

      • 我不希望为此操作浪费额外的 RCU,并且会使用条件表达式来实现相同的效果 - docs.aws.amazon.com/amazondynamodb/latest/developerguide/…
      • 不好的方法,请不要这样做。它会起作用,但它也会产生完全不必要的查询(因此产生不必要的成本和延迟)
      【解决方案3】:

      这是设计使然:

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

      发件人:https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html

      【讨论】:

      • 感谢您的意见。
      • 如果项目不存在,是否有一种简单的方法可以让命令失败?
      • 是的,您可以使用条件表达式来实现 - aws dynamodb delete-item \ --table-name ProductCatalog \ --key '{"Id": {"N": "id123"}} ' \ --condition-expression "attribute_not_exists(Price)"
      • @ManthanJamdagni 你会不会使用 attribute_exists() 代替,因为你只希望在属性存在时删除,如果不存在则失败,正如 OP 所说的那样?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      相关资源
      最近更新 更多