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

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

Ia 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"} dan Year kembali sebagai {"N": "1994"}. API resource (boto3.resource("dynamodb").Table(...).query) mengonversi dua arah dan menyerahkan Decimal('1994') — yang tepat untuk uang dan mengejutkan saat pertama kali ia menolak dijumlahkan dengan float.
  • 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 di FilterExpression, yang diteruskan boto3 apa adanya dan diterapkan DynamoDB setelah pembacaan. ScanIndexForward=False membalik 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

Referensi

Bangun request ini secara visual

Susun operasi ini di DynamoDB Query Builder gratis — key condition, filter, index, Limit, urutan sortir, dan loop paginasi — lalu salin kembali sebagai program SDK v3, CLI, atau boto3 yang bisa dijalankan.

Buka DynamoDB Query Builder

Bekerja dengan DynamoDB tanpa Console

Klien desktop DynamoDB yang cepat dan menjalankan SQL sungguhan yang tidak bisa dijalankan DynamoDB — JOINs, GROUP BY, agregasi — dengan editing visual dan agen AI pada kunci Bedrock milik Anda sendiri.

Uji coba gratis 30 hari, tanpa kartu kredit — lalu paket Free tanpa batas waktu.