【发布时间】:2012-10-21 06:29:00
【问题描述】:
如何使用 Boto python 库对来自 DynamoDB 的结果进行分页?从 Boto API 文档中,我无法确定它是否支持分页,尽管 DynamoDB API 确实支持分页。
【问题讨论】:
标签: python boto amazon-dynamodb
如何使用 Boto python 库对来自 DynamoDB 的结果进行分页?从 Boto API 文档中,我无法确定它是否支持分页,尽管 DynamoDB API 确实支持分页。
【问题讨论】:
标签: python boto amazon-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
【讨论】:
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 相关问题的一个很好的参考 :)
【讨论】:
也许我误解了这个问题,但我认为你让它变得比它需要的更困难。如果您在 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 的结果的分页。这同样适用于扫描请求。
【讨论】:
.query() 方法的方式!该文档需要更新!