Python'da DynamoDB BatchGetItem (boto3)
batch_get_item, tek bir istekte birincil anahtara göre 100'e kadar öğe getirir (en fazla 16 MB). boto3 düşük seviyeli istemcisi ile tablo → anahtarlar şeklinde bir RequestItems eşlemesi geçirirsiniz — ve UnprocessedKeys üzerinde döngü yapmak zorundasınız, çünkü bir toplu istek yasal olarak istediğinizin yalnızca bir kısmını döndürebilir.
Code
import time
import boto3
client = boto3.client("dynamodb")
request_items = {
"Music": {
"Keys": [
{"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "Cubano Chant"}},
{"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "A Mis Abuelos"}},
{"Artist": {"S": "Ella Fitzgerald"}, "SongTitle": {"S": "Misty"}},
]
}
}
items = []
attempt = 0
while request_items:
response = client.batch_get_item(RequestItems=request_items)
items.extend(response["Responses"].get("Music", []))
# A partial result is NOT an error: throttling, a >16 MB response, or an
# internal failure returns the leftovers in UnprocessedKeys. Retry them
# with exponential backoff.
request_items = response["UnprocessedKeys"]
if request_items:
attempt += 1
time.sleep(min(0.1 * 2**attempt, 5))
print(f"Fetched {len(items)} items")Açıklama
RequestItems— tablo adı →{"Keys": [...]}şeklinde bir eşleme; bir istek birden çok tabloya yayılabilir. Her anahtar, DynamoDB JSON'da ({"S": ...},{"N": ...}) tam birincil anahtar olmalıdır (bileşik bir anahtar için bölüm + sıralama). 100'den fazla anahtar ya da aynı anahtarın iki kez geçmesi birValidationExceptionfırlatır.Responses— tablo adı → bulunan öğeler şeklinde bir eşleme. Öğeler belirli bir sırada olmadan döner ve var olmayan anahtarlar basitçe görünmez — sonuçları anahtar özniteliklerine göre isteklerle eşleştirin.UnprocessedKeys— yukarıdaki yeniden deneme döngüsü isteğe bağlı değildir. Yanıt 16 MB'ı aşarsa, iş hacmi tükenirse ya da bir bölüm okuması 1 MB'ı aşarsa, DynamoDB kalanı buradaRequestItemsbiçiminde döndürür ve doğrudan geri beslenmeye hazırdır (boş bir eşleme bittiği anlamına gelir — Python'da falsy olur,while'ı sonlandıran budur). AWS, yeniden denemeler arasında üstel geri çekilmeyi şiddetle önerir.- Tutarlılık — toplu okumalar varsayılan olarak nihai tutarlıdır; güçlü tutarlı okumalar için tablo başına
"ConsistentRead": Trueayarlayın. - Tablo başına, yalnızca bazı öznitelikleri getirmek için ayrıca
ProjectionExpression(ExpressionAttributeNamesile) geçirebilirsiniz. - DynamoDB JSON yerine yerel Python türlerini mi tercih edersiniz? resource API'si düz değerlerle
dynamodb.batch_get_item(...)sunar, ancak yeniden deneme sözleşmesi aynıdır —UnprocessedKeys'i boşaltmak her iki durumda da sizin göreviniz.
Görsel olarak yapın
DynamoDB-JSON anahtar eşlemelerini elle bir araya getirmemeyi mi tercih edersiniz? DynamoDB Expression Builder, türlü anahtar/değer eşlemeleri oluşturur ve çalıştırılabilir kodu kopyalar; öğe boyutu hesaplayıcı ise bir toplu isteğin 16 MB tavanına ne kadar yaklaştığını gösterir.
Yeniden deneme döngüleri yazmadan, tablolar arası öğeleri bir grafik arayüzde (GUI) getirmek ve incelemek için — DynoTable'ı indirin.
İlgili örnekler
- Node.js'te DynamoDB BatchGetItem — AWS SDK v3 ile aynı toplu okuma.
- AWS CLI ile DynamoDB BatchGetItem — kabuktan aynı toplu okuma.
- Python'da DynamoDB GetItem — bunun toplu hâle getirdiği tek öğe okuması.
- DynamoDB'de toplu işlemler — sınırlar, kısmi başarısızlık ve toplu işlemenin ne zaman kazandırdığı.
- "Too many items requested for the BatchGetItem call" — bir istekte 100'den fazla anahtar.
- "Provided list of item keys contains duplicates" — bir toplu istekte aynı anahtarın iki kez geçmesi.
References
- BatchGetItem — Amazon DynamoDB API Reference
- DynamoDB.Client.batch_get_item — Boto3 documentation
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.