DynamoDB UpdateItem di Python (boto3)
boto3 memberi Anda dua client untuk panggilan ini dan keduanya berbeda pendapat tentang apa itu angka. client tingkat rendah di bawah mengirim dan menerima DynamoDB JSON, di mana setiap angka adalah string berkutip. resource("dynamodb").Table(...) menerima objek Python native, menolak float mentah-mentah, dan mengembalikan angka sebagai decimal.Decimal. Memilih salah satunya adalah keputusan sesungguhnya di halaman ini.
Kode
import boto3
client = boto3.client("dynamodb")
response = client.update_item(
TableName="Music",
Key={"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "Cubano Chant"}},
UpdateExpression="SET #upd0 = :updValue0, #upd1 = :updValue1 ADD #upd2 :updValue2",
ExpressionAttributeNames={"#upd0": "Genre", "#upd1": "Year", "#upd2": "Awards"},
ExpressionAttributeValues={":updValue0": {"S": "Latin Jazz"}, ":updValue1": {"N": "1994"}, ":updValue2": {"N": "1"}},
ReturnValues="ALL_NEW",
)
print(response["Attributes"]) # the item after the updatePenjelasan
- Tata bahasa klausa bukan urusan boto3.
UpdateExpressionadalah string buram yang sekadar diteruskannya; hanya DynamoDB yang mem-parsing-nya, jadi kesalahan berbiaya satu perjalanan bolak-balik.ADDdi sini adalah increment atomik yang menghapus race read-modify-write,attribute_exists(Artist)di dalamConditionExpressionmengubah upsert menjadi update-saja, dan selebihnya ada di update expression. - Responsnya punya tepat dua key tingkat teratas:
AttributesdanResponseMetadata. Tidak ada field status untuk diperiksa dan tidak ada jumlah baris. Kalau panggilannya kembali, berarti ia berhasil;ResponseMetadatamembawaRequestIddanHTTPStatusCodeyang Anda inginkan di baris log. ReturnValues="UPDATED_NEW"adalah pilihan hemat. Ia hanya mengembalikan atribut yang disentuh expression itu, yang pada item besar adalah selisih antara membaca satu penghitung dan mengirim balik seluruh catatan.- Error datang sebagai
botocore.exceptions.ClientError, dan Anda bercabang padae.response["Error"]["Code"]. Alias yang hilang menghasilkanValidationExceptiondengan pesanInvalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: Year. Subclass bertipe memang ada, tetapi hanya sebagai atribut yang dibangkitkan botocore pada instance client (client.exceptions.ConditionalCheckFailedException), tak pernah sebagai simbol yang bisa di-import, jadi fungsi helper tanpa client dalam scope harus memakai string kodenya.
Decimal atau DynamoDB JSON, pilih satu
API resource menolak float sebelum permintaannya dibangun, dengan pesan yang memberi tahu persis apa yang diinginkannya:
TypeError: Float types are not supported. Use Decimal types instead.Itu pemeriksaan tipe milik boto3 sendiri, bukan milik DynamoDB. Simpan Decimal("4.5") lewat API resource lalu baca kembali atribut yang sama lewat kedua client, dan Anda mendapat:
resource Rating: Decimal('4.5') Awards: Decimal('2')
client Rating: {'N': '4.5'} Awards: {'N': '2'}Tak ada yang salah; keduanya kontrak yang berbeda. Decimal mempertahankan presisi yang sebenarnya disimpan DynamoDB dan memaksa Anda memikirkan aritmetikanya, dengan konsekuensi Decimal("1") * 2 muncul di kode yang mengharapkan int. Client tingkat rendah memberi Anda string dan menyerahkan parsing-nya kepada Anda, dan itulah yang dilakukan cuplikan di atas.
Aturan yang mengikuti: jangan mencampur keduanya dalam satu jalur kode. Item yang ditulis lewat Table.put_item dan dibaca lewat client.get_item kembali dalam bentuk berbeda, dan bug-nya muncul di cabang yang paling jarang Anda uji.
Catatan tentang atribut TTL
SET numerik yang paling umum dalam codebase Python adalah TTL: SET expires_at = :t dengan Unix epoch. DynamoDB membaca atribut itu sebagai detik. Tulis int(time.time() * 1000) alih-alih itu dan nilainya jadi 1785269450912, yang sebagai detik mendarat di tahun 58542, jadi item-nya tidak pernah dihapus dan tak ada yang protes. Konverter TTL DynamoDB membaca kembali sebuah epoch dalam kedua satuan dan memberi tahu Anda yang mana yang Anda tulis. Untuk membaca kembali nilai tersimpannya dari tabel sungguhan setelah itu, unduh DynoTable.
Panduan terkait
- Update expression DynamoDB —
SET,ADD,REMOVE,DELETE, dan idiomnya. - Memahami ReturnValues — apa yang diberikan setiap opsi
ReturnValues. - "Attribute name is a reserved keyword" — mengapa map alias di sini bukan pilihan.
- Error sintaks "Invalid UpdateExpression" — kesalahan sintaks SET/ADD yang umum, diuraikan.
Referensi
- UpdateItem — Amazon DynamoDB API Reference
- update_item — Boto3 DynamoDB.Client Reference
- Update expressions — Amazon DynamoDB Developer Guide
Terakhir diverifikasi 2026-07-28 terhadap dokumentasi resmi AWS yang ditautkan di atas.