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 update

Penjelasan

  • Tata bahasa klausa bukan urusan boto3. UpdateExpression adalah string buram yang sekadar diteruskannya; hanya DynamoDB yang mem-parsing-nya, jadi kesalahan berbiaya satu perjalanan bolak-balik. ADD di sini adalah increment atomik yang menghapus race read-modify-write, attribute_exists(Artist) di dalam ConditionExpression mengubah upsert menjadi update-saja, dan selebihnya ada di update expression.
  • Responsnya punya tepat dua key tingkat teratas: Attributes dan ResponseMetadata. Tidak ada field status untuk diperiksa dan tidak ada jumlah baris. Kalau panggilannya kembali, berarti ia berhasil; ResponseMetadata membawa RequestId dan HTTPStatusCode yang 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 pada e.response["Error"]["Code"]. Alias yang hilang menghasilkan ValidationException dengan pesan Invalid 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

Referensi

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

Bekerja dengan DynamoDB tanpa Console

Klien desktop DynamoDB yang cepat dan menjalankan SQL sungguhan yang tidak bisa dijalankan DynamoDB — JOINs, GROUP BY, agregasi — dengan editing visual dan agen AI pada kunci Bedrock milik Anda sendiri.

Uji coba gratis 30 hari, tanpa kartu kredit — lalu paket Free tanpa batas waktu.