【问题标题】:DynamoDB Go SDK UpdateExpression won't accept a simple addition statementDynamoDB Go SDK UpdateExpression 不接受简单的加法语句
【发布时间】:2021-08-26 19:34:32
【问题描述】:

当我用这个表达式做UpdateItem

UpdateExpression: aws.String("SET ItemCount = ItemCount + 1"),

我收到此错误:

Invalid UpdateExpression: Syntax error; token: "1", near: "+ 1"

AWS SDK 无法通过简单的添加进行更新?

我也试过这个:

UpdateExpression: aws.String("SET :itemCount = :itemCount + :incr"),
ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
    ":incr":  {N : aws.String("1")},
    ":itemCount": {S : aws.String("ItemCount")},
},

这给出了这个错误:

Invalid UpdateExpression: Syntax error; token: ":itemCount", near: "SET :itemCount ="

表中不存在要更新的项目,不知道是不是这个问题。 SDK 必须足够聪明才能创建项目并将 ItemCount 属性设置为 1。AWS 文档说:

编辑现有项目的属性,或将新项目添加到表中 如果它不存在。

文档对此有误吗?

【问题讨论】:

    标签: amazon-dynamodb aws-sdk-go


    【解决方案1】:

    ExpressionAttributeValues 仅用于值,有一个单独的属性称为 ExpressionAttributeNames :)

    因此,在伪代码中,您需要:

    {
      UpdateExpression: "SET ItemCount = ItemCount + :inc",
      ExpressionAttributeValues: {":inc": "1"}
    }
    

    或者:

    {
      UpdateExpression: "SET :attr = :attr + :inc",
      ExpressionAttributeNames: {":attr": "ItemCount"},
      ExpressionAttributeValues: {":inc": "1"}
    }
    

    【讨论】:

      【解决方案2】:

      原始命令的问题

      UpdateExpression: aws.String("SET ItemCount = ItemCount + 1")
      

      DynamoDB 是否不允许在表达式中内联常量 - 相反,您需要在后面的示例中将常量命名为 :inc,并写为 SET ItemCount = ItemCount + :inc

      您第二次尝试的错误是您尝试将命名常量语法也用于属性名称...您不需要(只需将名称 ItemCount 内联,但如果您做,你应该使用正确的语法:引用是#attributename(不是:attributename)并且名称出现在ExpressionAttributeNames中,而不是ExpressionAttributeValues中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-05
        • 2017-05-15
        • 2022-12-03
        • 2018-07-22
        • 1970-01-01
        • 2021-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多