Python'da (boto3) DynamoDB UpdateItem

boto3 bu çağrı için size iki istemci verir ve ikisi sayının ne olduğu konusunda anlaşamaz. Aşağıdaki düşük düzeyli client, her sayının tırnaklanmış bir dize olduğu DynamoDB JSON'unu gönderir ve alır. resource("dynamodb").Table(...) ise yerel Python nesneleri alır, float'ı doğrudan reddeder ve sayıları decimal.Decimal olarak geri verir. Bu sayfadaki asıl karar, birini seçmektir.

Kod

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

Açıklama

  • Yan tümce dilbilgisi boto3'ün işi değildir. UpdateExpression, ilettiği donuk bir dizedir; onu yalnızca DynamoDB ayrıştırır, dolayısıyla hataların bedeli bir gidiş-dönüştür. Buradaki ADD, oku-değiştir-yaz yarışını ortadan kaldıran atomik artırmadır; bir ConditionExpression içindeki attribute_exists(Artist) upsert'i yalnızca-güncelleme hâline getirir ve geri kalanı güncelleme ifadeleri sayfasındadır.
  • Yanıtın tam olarak iki en üst düzey anahtarı vardır: Attributes ve ResponseMetadata. Kontrol edilecek bir durum alanı ya da satır sayısı yoktur. Çağrı döndüyse işe yaramıştır; ResponseMetadata, bir günlük satırında isteyeceğiniz RequestId ve HTTPStatusCode'u taşır.
  • ReturnValues="UPDATED_NEW" tutumlu seçenektir. Yalnızca ifadenin dokunduğu öznitelikleri döndürür; büyük bir öğede bu, tek bir sayacı okumakla kaydın tamamını geri taşımak arasındaki farktır.
  • Hatalar botocore.exceptions.ClientError olarak gelir ve e.response["Error"]["Code"] üzerinden dallanırsınız. Eksik bir takma ad, Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: Year mesajıyla bir ValidationException üretir. Tipli alt sınıflar gerçekten vardır, ama yalnızca botocore'un istemci örneğinde ürettiği öznitelikler olarak (client.exceptions.ConditionalCheckFailedException), hiçbir zaman içe aktarılabilir semboller olarak değil; dolayısıyla kapsamında istemci olmayan bir yardımcı işlev kod dizesini kullanmak zorundadır.

Decimal ya da DynamoDB JSON, birini seçin

Kaynak API'si float'ı istek kurulmadan önce reddeder ve mesajı size tam olarak ne istediğini söyler:

TypeError: Float types are not supported. Use Decimal types instead.

Bu, DynamoDB'nin değil boto3'ün kendi tür denetimidir. Kaynak API'si üzerinden Decimal("4.5") saklayın ve aynı özniteliği her iki istemciyle geri okuyun; şunu alırsınız:

resource Rating: Decimal('4.5') Awards: Decimal('2')
client Rating: {'N': '4.5'} Awards: {'N': '2'}

Hiçbiri yanlış değil; farklı sözleşmeler. Decimal, DynamoDB'nin gerçekte sakladığı hassasiyeti korur ve sizi aritmetik üzerine düşünmeye zorlar; bedeli, bir int bekleyen kodda Decimal("1") * 2 görmenizdir. Düşük düzeyli istemci size dizeler verir ve ayrıştırmayı size bırakır; yukarıdaki parçacığın yaptığı da budur.

Bundan çıkan kural: ikisini tek bir kod yolunda karıştırmayın. Table.put_item ile yazılıp client.get_item ile okunan bir öğe farklı bir biçimde geri gelir ve hata, hangi dalı daha az test ettiyseniz orada yüzeye çıkar.

TTL öznitelikleri üzerine bir not

Bir Python kod tabanındaki en yaygın sayısal SET bir TTL'dir: Unix epoch ile SET expires_at = :t. DynamoDB o özniteliği saniye olarak okur. Bunun yerine int(time.time() * 1000) yazın; değer 1785269450912 olur ve saniye olarak 58542 yılına düşer, dolayısıyla öğe hiç silinmez ve hiç kimse şikâyet etmez. DynamoDB TTL dönüştürücüsü bir epoch'u her iki birimde de geri okur ve size hangisini yazdığınızı söyler. Sonrasında saklanan değeri gerçek bir tablodan geri okumak için DynoTable'ı indirin.

İlgili kılavuzlar

Kaynaklar

En son 2026-07-28 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalış

DynamoDB’nin çalıştıramadığı gerçek SQL’i çalıştıran hızlı bir DynamoDB masaüstü istemcisi — JOINs, GROUP BY, toplamalar — görsel düzenleme ve kendi Bedrock anahtarların üzerinde bir yapay zekâ aracısıyla.

30 günlük ücretsiz deneme, kredi kartı yok — ardından süre sınırı olmayan Ücretsiz plan.