当前位置: 首页 > 知识库问答 >
问题:

Dynamodb updateItem与条件表达式返回项目是否更新

林子石
2023-03-14

我想在某些情况下更新一个项目,然后我想知道更新项目返回时项目是否更新。

留档对我来说似乎自相矛盾。

在本页上:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html在“条件更新”示例中,它表示“更新后显示的所有项目属性都将在响应中返回。”

在本页上:https://godoc.org/github.com/aws/aws-sdk-go/service/dynamodb#UpdateItemOutput它说属性是“UpdateItem操作之前出现的属性值的映射”

这两个我都不想要。我想要的是一个说明是否有更新的bool。

这就是我现在的大脑:

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个答案

唐兴贤
2023-03-14

原来我想做的是检查错误,看看它是否包含字符串条件检查失败异常

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
}
沈俊美
2023-03-14

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

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())
        }
    }
}
蒯硕
2023-03-14

一种方法是检查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
}
 类似资料:
  • New in Django 1.8. 条件表达式允许你在过滤器、注解、聚合和更新操作中使用 if ... elif ... else的逻辑。条件表达式为表中的每一行计算一系列的条件,并且返回匹配到的结果表达式。条件表达式也可以像其它 表达式一样混合和嵌套。 条件表达式类 我们会在后面的例子中使用下面的模型: from django.db import models class Client(m

  • 我正在编写一个lambda表达式来将给定的纬度和经度转换为地址。表达式应该以坐标为参数,并返回其相应的地址。但是,返回的值为null。以下是我的班级: 以下是logcat的输出: 以下是我的用法: 是类的对象,以下是相关接口: 当我尝试从相关适配器打印坐标时,它们会正确打印。因此,位置正在正确设置,但是当我试图从另一个类访问它时,它会显示字符串的空值。你能建议一个替代方法来从表达式中提取位置吗?

  • 当需要根据表达式,而不是参数的值或数量进行匹配时,条件表达式(Guards)就显得非常有用。如果你熟悉函数式编程的话,对条件表达式也不会陌生。 为了尽可能地接近CSS的语言结构,Less使用关键字 when 而不是 if/else来实现条件判断,因为 when 已经在CSS的 @media query 特性中被定义。 表达式中可以使用比较运算符、逻辑运算符、或检查函数来进行条件判断。 1、比较运算

  • 兴趣线是(*)。我猜函数相当于: 但是,在(*)中是否有专门为这种机制命名呢?还是仅仅是编译器由于返回类型而知道要调用哪个构造函数这一简单事实?

  • 尤达表达式 不要使用尤达表达式。尤达表达式是指,拿一个常量去和变量比较而不是拿变量去和常量比较。它就像是在表达 “蓝色是不是天空的颜色” 或者 “高个是不是这个男人的属性” 而不是 “天空是不是蓝的” 或者 “这个男人是不是高个子的” (译者注:名字起源于星球大战中尤达大师的讲话方式,总是用倒装的语序) 推荐: if ([myValue isEqual:@42]) { ... 不推荐: if ([

  • 英文原文:http://emberjs.com/guides/templates/conditionals/ 有些时候,或许我们只希望在一个属性存在的时候显示一部分模板。 这时,我们就可以使用{{#if}}助手按条件渲染一个代码块,如下所示: 1 2 3 {{#if person}} Welcome back, <b>{{person.firstName}} {{person.lastNam