为了账号安全,请及时绑定邮箱和手机立即绑定

带有条件表达式的 dynamodb updateitem 返回 item 是否更新

带有条件表达式的 dynamodb updateitem 返回 item 是否更新

Go
四季花海 2021-12-27 17:04:19
我想在某些条件下更新一个项目,然后我想知道当 UpdateItem 返回时该项目是否已更新。文档对我来说似乎矛盾。在此页面上:http : //docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html在“条件更新”示例中它说“更新后出现的所有项目属性都将返回在回应中。”在此页面上:https ://godoc.org/github.com/aws/aws-sdk-go/service/dynamodb#UpdateItemOutput 它说属性是“在 UpdateItem 操作之前出现的属性值映射”我真的不想要这些。我想要的是一个布尔值,表示是否有更新。这是我的大脑现在的位置:out, err := db.DynamoDB.UpdateItem(&dynamodb.UpdateItemInput{    TableName: tableName,    Key: map[string]*dynamodb.AttributeValue{        "KeyName": {S: aws.String(keyname)},    },    ExpressionAttributeNames: map[string]*string{        "#lock": aws.String("Lock"),    },    ExpressionAttributeValues: map[string]*string{        ":now":     aws.String(compfmt(time.Now())),        ":promise": aws.String(compfmt(time.Now().Add(30 * time.Second))),    },    ConditionExpression: aws.String("attribute_not_exist(#lock) OR :now > #lock"),    UpdateExpression:    aws.String("SET #lock = :promise"),})
查看完整描述

3 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

要做到这一点的方法之一是检查Code的awserr


import "github.com/aws/aws-sdk-go/aws/awserr"

func Lock()(bool, error) {

    //Create value v

    _, err := db.DynamoDB.UpdateItem(v)

    if err != nil {

         if ae, ok := err.(awserr.RequestFailure); ok && ae.Code() == "ConditionalCheckFailedException" {

             return false, nil

         }

        return false, err

    }

    return true, nil

}


查看完整回答
反对 回复 2021-12-27
?
BIG阳

TA贡献1859条经验 获得超6个赞

现在有常量来比较错误,而不是像其他答案一样使用硬编码字符串:


result, err := svc.UpdateItem(input)

if err != nil {

    if aerr, ok := err.(awserr.Error); ok {

        switch aerr.Code() {

        case dynamodb.ErrCodeConditionalCheckFailedException:

            fmt.Println(dynamodb.ErrCodeConditionalCheckFailedException, aerr.Error())

        default:

            fmt.Println(aerr.Error())

        }

    }

}


查看完整回答
反对 回复 2021-12-27
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

原来我想要做的是检查错误以查看它是否包含 string ConditionalCheckFailedException。


func Lock() (bool, error) {

  ...

  _, err := db.DynamoDB.UpdateItem(v)

  if err != nil {

    if strings.Contains(err.Error(), "ConditionalCheckFailedException") {

      return false, nil

    }

    return false, err

  }

  return true, nil

}


查看完整回答
反对 回复 2021-12-27
  • 3 回答
  • 0 关注
  • 233 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信