2016-03-25 3 views
1

Ich möchte ein Element unter bestimmten Bedingungen aktualisieren und dann würde ich gerne wissen, ob das Element aktualisiert wurde, wenn UpdateItem zurückgibt.dynamodb updatesitem mit conditionexpression return ob item aktualisiert

Die Dokumentation scheint mir widersprüchlich.

Auf dieser Seite: http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html im Beispiel "Conditional Update" heißt es "Alle Attribute des Elements, wie sie nach der Aktualisierung erscheinen, werden in der Antwort zurückgegeben."

Auf dieser Seite: https://godoc.org/github.com/aws/aws-sdk-go/service/dynamodb#UpdateItemOutput heißt es, dass „Eine Karte von Attributwerten, wie sie vor der UpdateItem Operation erschienen“ Attribut ist

will mich auch nicht wirklich davon. Was ich will, ist ein Bool, der sagt, ob es ein Update gab oder nicht. Diese

ist, wo mein Gehirn ist jetzt:

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

überprüfen verwenden 'ALL_NEW' oder' UPDATED_NEW' die neuen Werte in Attribute zu erhalten. – user1431317

+0

Ist das Ergebnis von 'UPDATED_NEW' leer, wenn kein Update vorhanden war? Oder gibt es den aktuellen Wert nach der Operation unabhängig zurück? – voutasaurus

+4

Sie müssen das selbst ausprobieren, aber wenn die Dokumentation korrekt ist, sollte die Attribute-Map in diesem Fall leer sein. – user1431317

Antwort

1

Eine Möglichkeit, dies zu tun, ist die Code auf dem Sie können 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

Es stellte sich heraus, was ich wollte, den Fehler zu tun war zu überprüfen, um zu sehen, ob es die Zeichenfolge ConditionalCheckFailedException enthalten.

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 
} 
Verwandte Themen