8

如何使用 Boto python 库对来自 DynamoDB 的结果进行分页?从 Boto API 文档中,我无法确定它是否支持分页,尽管 DynamoDB API 确实支持分页。

4

3 回答 3

8

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 对问题所做的那样。每页不超过 15 个。

如果您只需要一种方法来加载由给定生成的整个结果集Scan,那么 Boto 是一个很棒的库,并且已经为您抽象了它,而无需像我的回答中那样使用黑魔法。在这种情况下,您应该遵循他 (@garnaat) 的建议。顺便说一句,他是 Boto 的作者,因此是 Boto 相关问题的一个很好的参考 :)

于 2012-10-31T18:20:10.867 回答
4

也许我误解了这个问题,但我认为你让它变得比它需要的更困难。如果您在 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 的结果的分页。这同样适用于扫描请求。

于 2012-11-01T13:38:13.797 回答
0

你很有可能想要这样的东西:

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

于 2013-05-26T12:19:53.567 回答