Python'da DynamoDB Koşullu Yazma (boto3)
Bir koşullu yazma, bir put_item, update_item veya delete_item'a bir ConditionExpression iliştirir: DynamoDB bunu mevcut öğeye karşı değerlendirir ve yazmayı yalnızca geçerliyse uygular — atomik olarak, oku-değiştir-yaz yarışı olmadan. Bu, DynamoDB'nin iyimser-kilitleme ilkelidir. Bu örnek, bir güncellemeyi bir sürüm kontrolüyle korur.
Code
import boto3
client = boto3.client("dynamodb")
# Update the item only if nobody changed it since we read version 7.
try:
client.update_item(
TableName="Music",
Key={"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "Cubano Chant"}},
UpdateExpression="SET #upd0 = :updValue0, #version = :newVersion",
ConditionExpression="attribute_exists(#cond0) AND #version = :expectedVersion",
ExpressionAttributeNames={"#upd0": "Genre", "#version": "Version", "#cond0": "Artist"},
ExpressionAttributeValues={
":updValue0": {"S": "Latin Jazz"},
":expectedVersion": {"N": "7"},
":newVersion": {"N": "8"},
},
ReturnValuesOnConditionCheckFailure="ALL_OLD",
)
print("Updated to version 8")
except client.exceptions.ConditionalCheckFailedException as e:
# With ReturnValuesOnConditionCheckFailure="ALL_OLD", the current item
# rides back on the exception — no extra read to see what beat you.
print("Lost the race — item is now:", e.response.get("Item"))Açıklama
ConditionExpression— yazmayla atomik olarak depolanan öğeye karşı kontrol edilir. Kullanılabilir işlevler:attribute_exists,attribute_not_exists,attribute_type,contains,begins_with,size, artı karşılaştırıcılar (=,<>,<,>,<=,>=,BETWEEN,IN) veAND/OR/NOT.- İki temel deyim:
- Bir güncellemede
attribute_exists(#key)= "yalnızca güncelle, asla oluşturma". Bu olmadan, var olmayan bir anahtar üzerindekiupdate_itemöğeyi sessizce oluşturur (kazara-upsert hatası). - Bir put'ta
attribute_not_exists(#key)= "yalnızca oluştur, asla üzerine yazma" — PutItem sayfasında gösterilmiştir.
- Bir güncellemede
- İyimser kilitleme — öğeyi okuyun (sürüm 7), ardından 8'e yükseltirken
#version = :expectedVersionile yazın. İki eşzamanlı yazıcı ikisi birden kazanamaz; kaybedenConditionalCheckFailedExceptionalır, yeniden okur ve yeni sürümde yeniden dener. ReturnValuesOnConditionCheckFailure="ALL_OLD"— mevcut öğeyi istisna yanıtına (e.response) koyar; başarısız bir kontrolden sonra takip edenget_item'i ortadan kaldırır. Hiç okuma kapasitesi tüketmez; başarısız bir koşullu yazma yine de yazma denemesini faturalandırır.- resource API'sinde aynı koruma, yerel Python değerleriyle
table.update_item(..., ConditionExpression=Attr("Version").eq(7) & Attr("Artist").exists())şeklindedir.
Görsel olarak yapın
Koşul ifadeleri tam olarak DynamoDB Expression Builder'ın oluşturduğu şeydir — işlevi seçin, ifadeyi + ad/değer eşlemelerini çalıştırılabilir boto3 kodu olarak alın.
Elle yazılan yer tutucular yerine üretilen, gözden geçirilebilir ifadelerle öğeleri düzenlemek için — DynoTable'ı indirin.
İlgili örnekler
- Node.js'te DynamoDB koşullu yazma — AWS SDK v3 ile aynı iyimser kilit.
- AWS CLI ile DynamoDB koşullu yazma — kabuktan aynı iyimser kilit.
- Python'da DynamoDB PutItem — yalnızca-oluşturma
attribute_not_existsput'u. - DynamoDB koşul ifadeleri — desenlerle birlikte her işlev.
- Birden çok öznitelikte benzersizliği zorunlu kılma — koşullar + işlemler birlikte.
- DynamoDB ConditionalCheckFailedException — başarısız kontrol beklendiğinde ve bunun ucuza nasıl ele alınacağı.
References
- UpdateItem — Amazon DynamoDB API Reference
- DynamoDB.Client.update_item — Boto3 documentation
- Condition expressions — Amazon DynamoDB Developer Guide
- DynamoDB read and write operations (capacity unit consumption) — Amazon DynamoDB Developer Guide
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.