DynamoDB Query di Python (boto3)
Paginator query milik boto3 adalah alasan halaman ini pendek: ia menyembunyikan LastEvaluatedKey sepenuhnya. Ia juga menyembunyikan satu angka yang mungkin Anda butuhkan, dan itulah bagian yang perlu diketahui sebelum Anda memercayainya. Untuk menentukan kapan harus memakai query sama sekali, lihat Query vs. Scan.
Kode
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")Paginator tidak menjumlahkan tagihan Anda
Terhadap fixture 600 lagu, tiap lagu ~3,9 KB dan semuanya di bawah Artist = "Arturo Sandoval", loop-nya menghasilkan tiga halaman: 271, 271, dan 58 item, dengan biaya 128,5, 128,5, dan 27,5 read unit. Minta satu hasil gabungan dari paginator yang sama dan inilah yang Anda dapat:
build_full_result() -> Items 600 Count 600 ScannedCount 600
ConsumedCapacity.CapacityUnits 128.5Count dan ScannedCount dijumlahkan. ConsumedCapacity tidak — itu angka halaman pertama, sedangkan total sebenarnya adalah 284,5. Konfigurasi paginator DynamoDB milik botocore menjelaskan alasannya secara eksplisit: Count dan ScannedCount terdaftar sebagai result key, ConsumedCapacity sebagai non-aggregate key. Kalau Anda mencatat kapasitas dari build_full_result(), Anda melaporkan pembacaan satu partisi penuh kurang dari separuhnya.
Dict per halaman di dalam loop for page in paginator.paginate(...) di atas adalah respons mentah, jadi menjumlahkan sendiri page["ConsumedCapacity"]["CapacityUnits"] memberi angka jujur 284,5.
Limit yang membuat Anda menanggung 58 round trip tambahan
Limit adalah parameter query yang sah, jadi paginate() menerimanya, dan ia bukan parameter yang diharapkan pengguna Python:
paginate(..., Limit=10) -> 61 pages, 10 items each
paginate(...) -> 3 pagesIa membatasi item per permintaan, bukan total, jadi paginator dengan patuh melakukan 61 panggilan HTTP untuk mengambil 600 item yang sama. Untuk membatasi totalnya, pakai PaginationConfig={"MaxItems": 10}; PaginationConfig["PageSize"] adalah tombol yang memetakan ke Limit.
Diukur 2026-07-28 terhadap DynamoDB Local (amazon/dynamodb-local) dengan boto3 1.43.58 pada CPython 3.14.6.
Penjelasan
- Client berbicara DynamoDB JSON di kedua arah. Nilai masuk sebagai
{"S": "Arturo Sandoval"}danYearkembali sebagai{"N": "1994"}. API resource (boto3.resource("dynamodb").Table(...).query) mengonversi dua arah dan menyerahkanDecimal('1994')— yang tepat untuk uang dan mengejutkan saat pertama kali ia menolak dijumlahkan denganfloat. Key("Artist").eq(...)hanya milik API resource. Mengopernya ke client memicu error sebelum permintaannya berangkat:ParamValidationError: Invalid type for parameter KeyConditionExpression ... valid types: <class 'str'>. Client menginginkan string expression yang dibangun halaman ini.- Key condition adalah satu kesamaan plus paling banyak satu perbandingan sort key (
=,<,<=,>,>=,BETWEEN,begins_with). Taruh yang lain diFilterExpression, yang diteruskan boto3 apa adanya dan diterapkan DynamoDB setelah pembacaan.ScanIndexForward=Falsemembalik urutannya,IndexName="..."mengarahkannya ke sebuah index.
Lakukan secara visual
DynamoDB Expression Builder menulis key condition dan map ExpressionAttributeValues bertipe sebagai Python siap-boto3, yang justru bagian yang salah ketika Anda mengetik {"N": 2010} alih-alih {"N": "2010"}.
Untuk mengarahkan query yang sama ke tabel Anda sendiri dari sebuah form key condition dan membaca hasilnya di grid berpaginasi, unduh DynoTable.
Panduan terkait
- Query vs. Scan — mengapa
queryadalah default yang benar. - Key condition expression — setiap operator partition/sort key yang sah.
- "Query condition missed key schema element" — key condition menyebut atribut yang salah atau melewatkan partition key.
- "Query key condition not supported" — operator yang tidak bisa dipakai key condition, seperti contains atau kondisi sort key kedua.