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) ve AND/OR/NOT.
  • İki temel deyim:
    • Bir güncellemede attribute_exists(#key) = "yalnızca güncelle, asla oluşturma". Bu olmadan, var olmayan bir anahtar üzerindeki update_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.
  • İyimser kilitleme — öğeyi okuyun (sürüm 7), ardından 8'e yükseltirken #version = :expectedVersion ile yazın. İki eşzamanlı yazıcı ikisi birden kazanamaz; kaybeden ConditionalCheckFailedException alı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 eden get_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

References

En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalışın

DynoTable, DynamoDB için hızlı bir masaüstü istemcisidir — tablolara göz atın, SQL tarzı sorgular çalıştırın ve item'ları yerel olarak düzenleyin.