2016-01-22 7 views
28

zu kombinieren Ich versuche, die update_item-Funktionalität für DynamoDB in Boto3 zu verwenden.Ist es möglich, if_not_exists und list_append in update_item

Ich habe gerade Schwierigkeiten, Listen für Artikel zu aktualisieren. Ich möchte eine neue Liste erstellen, wenn die Liste noch nicht existiert, und sie an die bestehende Liste anhängen.

ein UpdateExpression des Formulars SET my_list = list_append(my_list, :my_value) wird als Fehler interpretiert „Der angegebene Ausdruck auf ein Attribut bezieht, die in dem Elemente nicht vorhanden“ wenn die Liste noch nicht vorhanden ist.

Irgendeine Idee, wie ich meine UpdateExpression ändern müsste?

Dank & freundlichen Grüßen Fabian

Antwort

65

können Sie list_append(if_not_exists()) Konstruktion verwenden.

UpdateExpression:

'SET my_list2 = list_append(if_not_exists(my_list2, :empty_list), :my_value)' 

ExpressionAttributeValues:

{ ":my_value":[{"S":"test"}], ":empty_list":[] } 
+0

Danke für den Hinweis! Ziemlich ordentliche Lösung. – fabian

+1

Hast du eine Ahnung, ob dies den Rennbedingungen unterliegt? Ich schaue mir die AWS-Dokumentation an und sie scheinen keine Sperren/Transaktionen zu haben (zumindest für das Python-SDK). Es scheint, als könnte dieser Code a: die Liste aus der DB lesen, b: den neuen Wert anhängen und c: den alten Wert überschreiben, der in der Zwischenzeit geändert werden konnte. –

+0

Ich kann keine direkte Bestätigung in der Dokumentation finden, aber ich würde erwarten, dass der einzelne UpdateItem-Vorgang atomar ist, was mir am nächsten kommt: "Sie können ein numerisches Attribut in einer Zeile mit einem einzigen API-Aufruf inkrementieren oder dekrementieren. Ebenso können Sie Sets, Listen oder Maps atomar hinzufügen oder entfernen ", siehe https://aws.amazon.com/dynamodb/faqs/ –