使用Boto在Amazon DynamoDB中进行分页

8

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

3个回答

8
确实支持类似于分页的行为,使用"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 相关问题的重要参考 :)


谢谢,这个可行。我想我是在寻找如何获取exclusive_start_key。顺便说一下,你的代码可能有一个悬挂的else。 - Anand
1
我知道"else"语句看起来有点奇怪;)但实际上,它是在"for"循环完全没有执行任何迭代时触发的。http://psung.blogspot.ca/2007/12/for-else-in-python.html - yadutaf
不,这正是我想要的,而不是加载整个结果集。 - Anand
1
jtlebi,这是一个很好的回答,+1。但是,你能否请指定一下MyTable的类型?我查看了oto.dynamodb2.table.Table的代码,scan()和query()(或query_2())方法没有“max_results”和“exclusive_start_key”参数。在MyTable的角色中应该导入和使用什么? - Dimitre Novatchev

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的结果分页。对于扫描请求,同样适用。


1
也许我没理解对,但这只允许逐个获取所有项目。我想要的是获取第N个“页面”,其中一个“页面”有K个项目。是否可以在不必读取所有(N-1)* K之前的项目(一遍又一遍,这是O(N^2))的情况下完成?请告诉我如何直接获取第N页,我将非常感激您的回答。 - Dimitre Novatchev
如果我理解正确的话,要实现您所描述的内容,您需要使用URL路径参数或URL查询字符串参数创建一个子资源。一旦配置完成(集成请求-主体映射和参数映射),您应该能够根据传递给资源(因此方法)的参数获得特定的结果。我知道这篇文章已经过时了,但它可能会帮助那些现在正在寻求帮助的人。 - Ephexx
1
这并没有给我完整的项目列表。另一个人得到了和我一样的结果:https://dev59.com/S5rga4cB1Zd3GeqPoIgM - João Abrantes
这不是官方示例中使用 .query() 方法的方式!那份文档需要更新! - CpILL
此外,似乎不起作用。在 Github 上也找不到查询方法的源代码? - CpILL

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接