2016-03-25 11 views
1

特定の条件の下でアイテムを更新したい場合、UpdateItemが返されたときにアイテムが更新されたかどうかを知りたいと思います。dynamodb updateitem with conditionexpressionアイテムが更新されたかどうかを返す

ドキュメントは私と矛盾しているようです。

このページでは、「条件付き更新」の例では、「更新後に表示されるすべてのアイテムの属性が応答に返されます」というメッセージが表示されます。このページ

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"), 
}) 
+2

Codeをチェックすることです。 – user1431317

+0

更新がなければ 'UPDATED_NEW'の結果は空になりますか?それとも、操作後に現在の値を返すのですか? – voutasaurus

+4

あなた自身で試してみる必要がありますが、ドキュメントが正しい場合は、その場合は属性マップが空である必要があります。 – user1431317

答えて

1

一つの方法は、あなたが `ALL_NEW`または` UPDATED_NEW`属性に新しい値を取得するために使用することができます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 
} 
0

は私がやりたいことが判明し、それが文字列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 
} 
関連する問題