【问题标题】:Pagination in Amazon DynamoDB using Boto使用 Boto 在 Amazon DynamoDB 中进行分页
【发布时间】:2012-10-21 06:29:00
【问题描述】:

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

【问题讨论】:

    标签: python boto amazon-dynamodb


    【解决方案1】:

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

    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

    【讨论】:

      【解决方案2】:

      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 相关问题的一个很好的参考 :)

      【讨论】:

      • 谢谢,这行得通。我想我正在寻找如何获得exclusive_start_key。顺便说一句,你可能在代码中有一个悬空的 else。
      • 我知道“else”语句看起来很奇怪;)但实际上,它是在“for”循环恰好执行 0 次迭代时触发的。 psung.blogspot.ca/2007/12/for-else-in-python.html
      • 我不知道。谢谢!
      • 不,这正是我想要的,而不是加载整个结果集。
      • jtlebi,这是一个很好的答案,+1。但是,请您指定 MyTable 的类型是什么?我查看了 oto.dynamodb2.table.Table 的代码,并且 scan() 和 query()(或 query_2())方法没有“max_results”和“exclusive_start_key”参数。 MyTable的角色我应该导入和使用什么?
      【解决方案3】:

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

      【讨论】:

      • 也许我有什么不明白的,但这只能让所有的项目一个接一个。我想要的是获得第 N 个“页面”,其中一个“页面”有 K 个项目。无需阅读所有 (N-1) * K 前面的项目(一次又一次,即 O(N^2)) 就可以做到这一点吗?请,我会很感激你回答如何直接获取pageN。
      • 如果我理解正确,要完成您所描述的,您将使用 URL 路径参数或 URL 查询字符串参数创建一个子资源。一旦配置(集成请求 - 主体映射和参数映射),您应该能够根据您传递给资源的参数(以及方法)获得特定的结果。我知道这篇文章已经过时了,但可以帮助那些现在寻求帮助的人。
      • 这并没有给我完整的项目列表。另一个人和我得到相同的结果:stackoverflow.com/questions/39355377/…
      • 这不是official examples 使用.query() 方法的方式!该文档需要更新!
      • 另外,似乎不起作用。在github ether上找不到查询方法源码?
      猜你喜欢
      • 2017-08-03
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-12
      • 1970-01-01
      相关资源
      最近更新 更多