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

Count 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 pages

Toplamı 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 ve Year {"N": "1994"} olarak geri gelir. Kaynak API'si (boto3.resource("dynamodb").Table(...).query) her iki yönde de dönüştürür ve size Decimal('1994') verir — ki bu para için doğrudur ve bir float'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ığı bir FilterExpression'a koyun. ScanIndexForward=False sı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

Kaynaklar

Bu isteği görsel olarak oluştur

Bu operasyonu ücretsiz DynamoDB Sorgu Oluşturucuda kur — anahtar koşulu, filtre, index, Limit, sıralama yönü ve bir sayfalama döngüsü — ve çalıştırılabilir bir SDK v3, CLI veya boto3 programı olarak geri kopyala.

DynamoDB Sorgu Oluşturucuyu aç

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.