Boto Python ライブラリを使用して DynamoDB からの結果をページ分割するにはどうすればよいですか? DynamoDB API にはページネーションがサポートされていますが、Boto API のドキュメントから、ページネーションがサポートされているかどうかさえわかりません。
3 に答える
Boto は、「ExclusiveStartKey」と「Limit」の組み合わせを使用した「ページネーション」のような動作をサポートしています。たとえば、改ページしScan
ます。
以下は、テーブル全体を 10 個のチャンクで解析する例です。
esk = None
while True:
# load this batch
scan_generator = MyTable.scan(max_results=10, exclusive_start_key=esk)
# do something usefull
for item in scan_generator:
pass # do something usefull
# are we done yet ?
else:
break;
# Load the last keys
esk = scan_generator.kwargs['exclusive_start_key'].values()
編集:
@garnaat が指摘したように、実際の目標を誤解している可能性があります。上記の提案により、たとえば質問に対してSOが行うように、ページネーションを提供できます。1 ページあたり 15 個以下。
特定のによって生成された結果セット全体をロードする方法が必要なだけの場合Scan
、Boto は優れたライブラリであり、私の回答のように黒魔術を必要とせずに、すでにこれを抽象化しています。この場合、彼 (@garnaat) のアドバイスに従う必要があります。ところで、彼は Boto の作者であり、Boto 関連の質問に対する素晴らしいリファレンスです :)
おそらく私は質問を誤解していますが、必要以上に難しくしていると思います。boto (デフォルト) で layer2 DynamoDB インターフェイスを使用している場合は、ページネーションが処理されます。
したがって、クエリ操作を実行する場合は、次のようにするだけです。
import boto
c = boto.connect_dynamodb()
t = c.get_table('mytable')
for item in t.query(hash_key='foo'):
print item
これにより、DynamoDB からの結果のページネーションが自動的に処理されます。同じことがスキャン要求にも機能します。
次のようなものが必要になる可能性が十分にあります。
qms = tms.query(hash_key=415772421368583351, max_results=2, exclusive_start_key=None)
for i in qms:
print i
lek = qms.last_evaluated_key
qms = tms.query(hash_key=415772421368583351, max_results=2, exclusive_start_key=lek)
for i in qms:
print i
もちろん、これはデモンストレーションのためのばかげた例です。
ここで重要なのはlast_evaluated_key
、exclusive_start_key