Penulisan Bersyarat DynamoDB dengan AWS CLI

Penulisan bersyarat mudah dikirim dari shell dan canggung untuk dibaca, karena hasil menarik dari penulisan yang gagal datang sebagai error alih-alih sebagai keluaran. Condition expression DynamoDB membahas apa saja yang bisa dinyatakan expression itu; halaman ini tentang menjalankannya dari CLI dan mengeluarkan item yang kalah dari kegagalan tersebut.

Kode

aws dynamodb update-item \
  --table-name 'Music' \
  --key '{"Artist":{"S":"Arturo Sandoval"},"SongTitle":{"S":"Cubano Chant"}}' \
  --update-expression 'SET #upd0 = :updValue0, #version = :newVersion' \
  --condition-expression 'attribute_exists(#cond0) AND #version = :expectedVersion' \
  --expression-attribute-names '{"#upd0":"Genre","#version":"Version","#cond0":"Artist"}' \
  --expression-attribute-values '{":updValue0":{"S":"Latin Jazz"},":expectedVersion":{"N":"7"},":newVersion":{"N":"8"}}'

Saat berhasil, perintah itu tidak mencetak apa pun dan keluar dengan status 0. Jika penulis lain sampai lebih dulu, kondisinya gagal dan CLI melaporkan pesan layanan:

An error occurred (ConditionalCheckFailedException) when calling the UpdateItem operation:
The conditional request failed

Penjelasan

  • Keberhasilan itu senyap. Tanpa keluaran, keluar dengan status 0. Tak ada yang bisa di-parse dan tak ada yang bisa diassert, jadi skrip shell harus memperlakukan status keluar sebagai hasilnya. Tambahkan --return-values ALL_NEW kalau Anda ingin item yang diperbarui dicetak.
  • Kegagalan adalah status keluar 254, yaitu kode CLI v2 untuk error sisi klien dan dipakai bersama oleh request yang bentuknya salah. Cabangkan berdasarkan pesannya sebelum Anda mencoba ulang, atau salah ketik di expression Anda berubah menjadi loop backoff tanpa akhir.
  • --return-values-on-condition-check-failure ALL_OLD memang bekerja di sini. Nilai yang sah adalah ALL_OLD dan NONE, dan ia tidak memakan kapasitas baca. Mengeluarkan item dari error itu butuh satu flag lagi, dibahas di bawah.
  • Kondisi dan update adalah flag terpisah dengan namespace bersama. --expression-attribute-names dan --expression-attribute-values digabung lintas --update-expression dan --condition-expression, itulah sebabnya nama yang dihasilkan berjalan #upd0, #cond0 alih-alih memulai ulang per klausa. Pakai ulang satu placeholder untuk dua makna berbeda dan yang kedua menang secara diam-diam.
  • Penulisan yang gagal tetap ditagih. Developer Guide menyatakannya terang-terangan: kondisi yang bernilai false tetap memakan kapasitas tulis, diukur pada item yang lebih besar antara yang lama dan yang baru. Kondisi bukan probe keberadaan yang murah.

Keluaran kegagalannya, dan cara mengeluarkan item darinya

Jalankan blok itu sekali dan ia berhasil secara senyap. Jalankan kedua kalinya, saat Version bukan lagi 7, dan aws-cli/2.36.9 mencetak ke stderr:

aws: [ERROR]: An error occurred (ConditionalCheckFailedException) when calling the UpdateItem operation: The conditional request failed

Tambahkan --return-values-on-condition-check-failure ALL_OLD dan keluaran default memberi tahu Anda bahwa ada lebih banyak, tanpa menunjukkannya:

aws: [ERROR]: An error occurred (ConditionalCheckFailedException) when calling the UpdateItem operation: The conditional request failed

Additional error details:
Item: <complex value>
Use "--cli-error-format json" or another error format to see the full details.

<complex value> adalah item itu, ditahan oleh perender teks default. Tambahkan --cli-error-format json dan seluruhnya tercetak:

{
    "Message": "The conditional request failed",
    "Code": "ConditionalCheckFailedException",
    "Item": {
        "Artist": {"S": "Arturo Sandoval"},
        "Year": {"N": "1994"},
        "Version": {"N": "8"},
        "SongTitle": {"S": "Cubano Chant"},
        "AlbumTitle": {"S": "Danzon"},
        "Genre": {"S": "Latin Jazz"}
    }
}

(Map atribut dilipat menjadi satu baris masing-masing; selebihnya persis seperti yang tercetak.) Version bernilai 8 dan Genre sudah terisi karena jalannya yang pertama berhasil. Itulah loop optimistic-locking yang tertutup dari sebuah skrip shell: pipe stderr melalui jq -r '.Item.Version.N', umpankan kembali sebagai :expectedVersion, coba lagi. Tanpa get-item, dan tanpa jeda antara pembacaan dan percobaan ulang bagi penulis ketiga untuk menyelinap masuk.

Percobaan ulangnya tidak gratis. Setiap upaya yang ditolak memakan satu write unit, jadi key yang diperebutkan di bawah loop ketat ditagih terus-menerus tanpa membuat kemajuan. Kalkulator harga mengubah laju tulis menjadi angka bulanan kalau Anda ingin tahu berapa sebenarnya biaya badai percobaan ulang sebelum Anda membatasi jumlah upayanya.

Untuk menjalankan penjaga ini terhadap tabel Anda sendiri tanpa perlu meng-quote map placeholder di shell, unduh DynoTable.

Contoh 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.