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) danAND/OR/NOT.- Dua idiom andalan:
attribute_exists(#key)pada update = "hanya update, tidak pernah membuat". Tanpanya,update_itempada 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 = :expectedVersionsambil menaikkan ke 8. Dua penulis serentak tidak bisa keduanya menang; yang kalah mendapatConditionalCheckFailedException, membaca ulang, dan mencoba lagi pada versi baru. ReturnValuesOnConditionCheckFailure="ALL_OLD"— menaruh item saat ini pada response exception (e.response), menghematget_itemlanjutan 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
- Penulisan bersyarat DynamoDB di Node.js — optimistic lock yang sama dengan AWS SDK v3.
- Penulisan bersyarat DynamoDB dengan AWS CLI — optimistic lock yang sama dari shell.
- DynamoDB PutItem di Python — put
attribute_not_existshanya-membuat. - Condition expression DynamoDB — setiap fungsi, dengan polanya.
- Menegakkan keunikan pada beberapa atribut — kondisi + transaksi digabungkan.
- DynamoDB ConditionalCheckFailedException — kapan pemeriksaan yang gagal itu diharapkan, dan cara menanganinya dengan murah.
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
Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.