Wenn ich eine Tabelle mit einem Hash-Schlüssel von userId und einem Bereichsschlüssel von productId habe, wie lege ich ein Element nur dann in diese Tabelle, wenn es nicht bereits mit dynamo-Bindings von boto3 existiert?
Der normale Aufruf von put_item sieht so aus
%Vor%Mein Aufruf mit einer ConditionExpression sieht folgendermaßen aus:
%Vor%Aber das löst jedes Mal eine ConditionalCheckFailedException aus. Gibt an, ob ein Element mit der gleichen ProductId existiert oder nicht.
Die Dokumentation dafür ist leider nicht übersichtlich. Ich musste etwas Ähnliches erreichen, und hier ist, was für mich funktionierte, mit Boto3:
%Vor%Ähnlich wie bei der anderen Antwort befindet sich der Schlüssel in der attribute_not_exists-Funktion, aber es war mir zunächst unklar, wie das funktioniert. Nach einigen Experimenten war ich in der Lage, mit dem oben genannten loszulegen.
Ich denke, dass Sie mit client.put_item und nicht mit table.put_item
eine bessere Dokumentation erhaltenvon boto3 Dokumentation :
Um zu verhindern, dass ein neues Element ein vorhandenes Element ersetzt, verwenden Sie einen Bedingungsausdruck, der die Funktion attribute_not_exists enthält, wobei der Name des Attributs als Partitionsschlüssel für die Tabelle verwendet wird. Da jeder Datensatz dieses Attribut enthalten muss, ist die attribute_not_exists-Funktion nur erfolgreich, wenn kein übereinstimmendes Element vorhanden ist.
Bedingung Ausdruck:
ConditionExpression (string) - Eine Bedingung, die in erfüllt sein muss Reihenfolge für eine bedingte PutItem-Operation, um erfolgreich zu sein.
Ein Ausdruck kann eine der folgenden Angaben enthalten:
Funktionen: attribute_exists | attribute_not_exists | Attributstyp | enthält | beginnt_mit | Größe Bei diesen Funktionsnamen wird zwischen Groß- und Kleinschreibung unterschieden.
Ich benutze dynamodb2 überschreiben Parameter auf item.save()
Tags und Links python boto3 amazon-dynamodb