Ambil Semua Item dari DynamoDB di Python (boto3)
Membaca satu tabel utuh di boto3 berarti melakukan paginasi scan sampai habis. Setiap respons dibatasi 1 MB, dan paginator bawaan pada client tingkat rendah mengikuti LastEvaluatedKey melintasi setiap halaman untuk Anda (cara kerja kursor DynamoDB).
API boto3 mana yang Anda pilih lebih menentukan di sini daripada paginasinya, dan paginator hanyalah separuh alasannya.
Kode
import boto3
client = boto3.client("dynamodb")
paginator = client.get_paginator("scan")
items = []
for page in paginator.paginate(TableName="Music"):
items.extend(page["Items"])
print(f"Table holds {len(items)} items")Penjelasan
- Paginator milik client, bukan resource —
boto3.resource("dynamodb").Table(…).scantidak punya paginator sama sekali, jadi di sana Anda menulis sendiri loopLastEvaluatedKey-nya. Itu saja sudah alasan bagus untuk memakai client tingkat rendah pada pembacaan penuh. - API resource mengubah angka menjadi
Decimal—{"N": "1994"}yang tersimpan kembali sebagaiDecimal('1994'), yang menolak diserialisasijson.dumpstanpa encoder khusus. Client di atas memberi Anda{"N": "1994"}mentah dan menyerahkan konversinya kepada Anda (enkodingnya). - Setel paginator-nya, jangan menggantinya —
paginator.paginate(TableName="Music", PaginationConfig={"PageSize": 500, "MaxItems": 10000}). Boto3 mendefinisikanPageSizesebagai "the number of items returned per page of each result" danMaxItemssebagai batas atas totalnya, yang memancarkanNextTokenuntuk Anda lanjutkan lewatStartingToken. - Parallel scan butuh satu client per thread, dibangun dengan hati-hati —
SegmentdanTotalSegmentsmembagi pekerjaannya, dan panduan boto3 sendiri menyatakan client bersifat thread-safe sementara session dan resource tidak. Ia juga memperingatkan bahwa "Invokingboto3.client()inside of a concurrent context may result in response ordering issues". Bangun client-nya sebelum Anda menyebar, atau beri setiap workerboto3.session.Session()miliknya sendiri (kapan paralel itu sepadan). itemstumbuh sebesar tabelnya — tangani setiappagedi dalam loop alih-alih menambah list yang Anda simpan, kecuali Anda memang sudah tahu tabelnya kecil.- Scan menagih setiap byte yang dibacanya, pada setiap kali jalan —
ProjectionExpressionmengecilkan responsnya dan bukan tagihannya (alasannya);FilterExpressionmembuang item setelah item itu dibaca dan ditagih (Scan dengan filter). Pada jalur panas Anda menginginkan sebuah query.
Lakukan secara visual
Tagihan sebuah scan penuh adalah ukuran item dikali jumlah item, dibulatkan ke atas dalam satuan 4 KB. Kalkulator ukuran item memberi Anda separuh per-item dari perhitungan itu dari sebuah item yang ditempel.
DynoTable justru menelusuri tabel live dalam grid dengan infinite scroll, dan editor SQL-nya menyebutkan operasi yang menjadi hasil kompilasi query Anda sebelum Anda menjalankannya. Perkiraan RCU hanya muncul saat metadata tabel mendukungnya. Unduh DynoTable.
Contoh terkait
- Ambil semua item di Node.js — pembacaan penuh yang sama dengan loop eksplisit.
- Ambil semua item dengan AWS CLI — CLI melakukan paginasi untuk Anda.
- DynamoDB Scan di Python — scan dengan
FilterExpression. - Parallel scan — Segment/TotalSegments, jumlah worker, dan kapan itu layak dilakukan.
- Mengapa Scan DynamoDB saya lambat dan mahal? — model biayanya dan cara menghindarinya.
- DynamoDB ProvisionedThroughputExceededException — membaca seluruh tabel adalah cara klasik untuk memicunya.
- "The provided starting key is invalid" — key lanjutan yang rusak di dalam loop paginasi.
Referensi
- Scan — Amazon DynamoDB API Reference
- DynamoDB.Paginator.Scan — Boto3 documentation
- Scanning tables in DynamoDB — Amazon DynamoDB Developer Guide
- DynamoDB read and write operations (capacity unit consumption) — Amazon DynamoDB Developer Guide
- Paginators — Boto3 documentation
- Clients (thread safety) — Boto3 documentation
Terakhir diverifikasi 2026-07-28 terhadap dokumentasi resmi AWS yang ditautkan di atas.