Penulisan Bersyarat DynamoDB di Python (boto3)

Sebuah penulisan bersyarat melampirkan ConditionExpression ke put_item, update_item, atau delete_item: DynamoDB mengevaluasinya terhadap item saat ini dan menerapkan penulisan hanya jika kondisi terpenuhi — secara atomik, tanpa race read-modify-write. Ini adalah primitif optimistic-locking DynamoDB. Contoh ini menjaga sebuah update dengan pemeriksaan versi.

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"))

Penjelasan

  • ConditionExpression — diperiksa terhadap item tersimpan secara atomik bersama penulisan. Fungsi yang tersedia: attribute_exists, attribute_not_exists, attribute_type, contains, begins_with, size, plus komparator (=, <>, <, >, <=, >=, BETWEEN, IN) dan AND/OR/NOT.
  • Dua idiom andalan:
    • attribute_exists(#key) pada update = "hanya update, tidak pernah membuat". Tanpanya, update_item pada key yang hilang diam-diam membuat item (bug upsert tak sengaja).
    • attribute_not_exists(#key) pada put = "hanya membuat, tidak pernah menimpa" — ditunjukkan di halaman PutItem.
  • Optimistic locking — baca item (versi 7), lalu tulis dengan #version = :expectedVersion sambil menaikkan ke 8. Dua penulis serentak tidak bisa keduanya menang; yang kalah mendapat ConditionalCheckFailedException, membaca ulang, dan mencoba lagi pada versi baru.
  • ReturnValuesOnConditionCheckFailure="ALL_OLD" — menaruh item saat ini pada response exception (e.response), menghemat get_item lanjutan setelah pemeriksaan yang gagal. Ia mengonsumsi tidak ada kapasitas baca; penulisan bersyarat yang gagal tetap menagih upaya penulisannya.
  • Pada resource API penjaga yang sama adalah table.update_item(..., ConditionExpression=Attr("Version").eq(7) & Attr("Artist").exists()) dengan nilai Python native.

Lakukan secara visual

Condition expression persis apa yang dibangun DynamoDB Expression Builder — pilih fungsinya, dapatkan expression + map name/value sebagai kode boto3 yang bisa dijalankan.

Untuk mengedit item dengan expression yang dihasilkan dan bisa ditinjau alih-alih placeholder yang diketik dengan tangan — unduh DynoTable.

Contoh terkait

References

Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.

Bekerja dengan DynamoDB tanpa Console

DynoTable adalah klien desktop yang cepat untuk DynamoDB — jelajahi tabel, jalankan query gaya SQL, dan edit Item secara lokal.