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 updateAçı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. BuradakiADD, oku-değiştir-yaz yarışını ortadan kaldıran atomik artırmadır; birConditionExpressioniçindekiattribute_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:
AttributesveResponseMetadata. 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ğinizRequestIdveHTTPStatusCode'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.ClientErrorolarak gelir vee.response["Error"]["Code"]üzerinden dallanırsınız. Eksik bir takma ad,Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: Yearmesajıyla birValidationExceptionü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
- DynamoDB güncelleme ifadeleri —
SET,ADD,REMOVE,DELETEve deyimler. - ReturnValues'ı anlamak — her
ReturnValuesseçeneği size ne verir. - "Attribute name is a reserved keyword" — buradaki takma ad eşlemesi neden isteğe bağlı değil.
- "Invalid UpdateExpression" sözdizimi hataları — yaygın SET/ADD sözdizimi hataları, çözümlenmiş hâliyle.
Kaynaklar
- UpdateItem — Amazon DynamoDB API Reference
- update_item — Boto3 DynamoDB.Client Reference
- Update expressions — Amazon DynamoDB Developer Guide
En son 2026-07-28 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.