Python'da DynamoDB Query (boto3)
Bu sayfanın kısa olmasının nedeni boto3'ün query sayfalayıcısıdır: LastEvaluatedKey'i tümüyle gizler. Ayrıca muhtemelen istediğiniz bir sayıyı da gizler ki asıl bilmeye değer kısım, ona güvenmeden önce budur. query'ye hiç başvurmanız gerekip gerekmediği için bkz. Query ile Scan.
Kod
import boto3
client = boto3.client("dynamodb")
paginator = client.get_paginator("query")
items = []
for page in paginator.paginate(
TableName="Music",
KeyConditionExpression="#hashKey = :hashKeyValue AND begins_with(#rangeKey, :rangeKeyValue)",
ExpressionAttributeNames={"#hashKey": "Artist", "#rangeKey": "SongTitle"},
ExpressionAttributeValues={":hashKeyValue": {"S": "Arturo Sandoval"}, ":rangeKeyValue": {"S": "C"}},
):
items.extend(page["Items"])
print(f"Found {len(items)} items")Sayfalayıcı faturanızı toplamaz
Her şarkısı ~3,9 KB olan ve hepsi Artist = "Arturo Sandoval" altında bulunan 600 şarkılık bir düzeneğe karşı döngü üç sayfa verir: 271, 271 ve 58 öğe; sırasıyla 128,5; 128,5 ve 27,5 okuma birimine mal olur. Aynı sayfalayıcıdan tek bir birleşik sonuç isteyin; şunu alırsınız:
build_full_result() -> Items 600 Count 600 ScannedCount 600
ConsumedCapacity.CapacityUnits 128.5Count ve ScannedCount toplandı. ConsumedCapacity toplanmadı — o, ilk sayfanın rakamıdır ve gerçek toplam 284,5'ti. botocore'un DynamoDB sayfalayıcı yapılandırması nedeni konusunda açıktır: Count ve ScannedCount sonuç anahtarı olarak, ConsumedCapacity ise toplanmayan anahtar olarak listelenmiştir. Kapasiteyi build_full_result()'tan günlüklüyorsanız, tam bir bölüm okumasını yarısından fazla eksik bildiriyorsunuz demektir.
Yukarıdaki for page in paginator.paginate(...) döngüsündeki sayfa başına sözlükler ham yanıtlardır; dolayısıyla page["ConsumedCapacity"]["CapacityUnits"]'i kendiniz toplamak size dürüst 284,5'i verir.
Size 58 fazladan gidiş-dönüşe mal olan Limit
Limit geçerli bir query parametresidir, dolayısıyla paginate() onu kabul eder ve Python kullanıcılarının beklediği parametre değildir:
paginate(..., Limit=10) -> 61 pages, 10 items each
paginate(...) -> 3 pagesToplamı değil, istek başına öğeleri sınırlar; dolayısıyla sayfalayıcı aynı 600 öğeyi getirmek için sadakatle 61 HTTP çağrısı yapar. Toplamı sınırlamak için PaginationConfig={"MaxItems": 10} kullanın; Limit'e eşlenen düğme PaginationConfig["PageSize"]'dır.
2026-07-28 tarihinde CPython 3.14.6 üzerinde boto3 1.43.58 ile, DynamoDB Local'e (amazon/dynamodb-local) karşı ölçüldü.
Açıklama
- İstemci her iki yönde de DynamoDB JSON konuşur. Değerler
{"S": "Arturo Sandoval"}olarak girer veYear{"N": "1994"}olarak geri gelir. Kaynak API'si (boto3.resource("dynamodb").Table(...).query) her iki yönde de dönüştürür ve sizeDecimal('1994')verir — ki bu para için doğrudur ve birfloat'a eklenmeyi reddettiği ilk seferde şaşırtıcıdır. Key("Artist").eq(...)yalnızca kaynak API'sine aittir. Onu istemciye geçirmek, istek çıkmadan önce hata verir:ParamValidationError: Invalid type for parameter KeyConditionExpression ... valid types: <class 'str'>. İstemci, bu sayfanın kurduğu ifade dizesini ister.- Anahtar koşulu bir eşitlik artı en fazla bir sıralama anahtarı karşılaştırmasıdır (
=,<,<=,>,>=,BETWEEN,begins_with). Başka her şeyi, boto3'ün doğrudan geçirdiği ve DynamoDB'nin okumadan sonra uyguladığı birFilterExpression'a koyun.ScanIndexForward=Falsesırayı tersine çevirir,IndexName="..."bir indeksi hedefler.
Görsel olarak yapın
DynamoDB Expression Builder, anahtar koşulunu ve tipli ExpressionAttributeValues eşlemesini boto3'e hazır Python olarak yazar — ki {"N": "2010"} yerine {"N": 2010} yazdığınızda ters giden kısım tam da budur.
Aynı sorguyu bir anahtar koşulu formundan kendi tablolarınıza yöneltmek ve sonuçları sayfalanmış bir ızgarada okumak için DynoTable'ı indirin.
İlgili kılavuzlar
- Query ile Scan —
queryneden doğru varsayılandır. - Anahtar koşulu ifadeleri — her geçerli bölüm/sıralama anahtarı operatörü.
- "Query condition missed key schema element" — anahtar koşulu yanlış özniteliği adlandırıyor ya da bölüm anahtarını atlıyor.
- "Query key condition not supported" — anahtar koşulunun kullanamayacağı bir operatör, contains ya da ikinci bir sıralama anahtarı koşulu gibi.