【问题标题】:How to get the row count of a table instantly in DynamoDB?如何在 DynamoDB 中立即获取表的行数?
【发布时间】:2015-10-01 10:06:18
【问题描述】:

我正在使用boto.dynamodb2,看来我可以使用Table.query_count()。但是,当没有应用查询过滤器时,它会引发异常。

我能做些什么来解决这个问题?

顺便说一句,boto.dynamodb2.table.Table.Query 可以使用的过滤器文档在哪里?我试图搜索它,但什么也没找到。

【问题讨论】:

    标签: python amazon-dynamodb boto


    【解决方案1】:

    您可以通过两种方式在 DynamoDB 中获取行数。

    第一个是执行全表扫描并在执行过程中计算行数。对于任何合理大小的表,这通常是一个可怕的想法,因为它会消耗您预置的所有读取吞吐量。

    另一种方法是使用Describe Table 请求来估计表中的行数。这将立即返回,但只会根据 AWS 文档定期更新。

    指定索引中的项目数。 DynamoDB 更新了这个 值大约每六个小时。最近的变化可能不是 反映在这个值中。

    【讨论】:

    • 没有。 AWS 将每 6 小时自动为您更新一次行数。如果您想要更准确的行数,您可以尝试跟踪表外的行数,例如在另一个 DynamoDB 表中,但这会带来一系列问题。
    • 没有。此值将由 AWS 定期更新,目前无法强制对其进行任何类型的更新。
    • 你绝对可以从控制台强制它。转到表的概览选项卡并单击“管理实时计数”,然后单击“开始扫描”。 @cryanbhu
    • 估计?有什么?在大多数数据库中,获取所有行的计数是最简单的事情之一。如果 dynamodb 没有那么简单,那么它毫无价值,任何理智的人都不应该使用它。
    • @SamanthaAtkins 请记住,DynamoDb 是一个 No-SQL 数据存储。它旨在解决与关系数据库解决的问题不同的问题。我可以向你保证,理智的人设计了它,理智的人使用它,并从中发现了巨大的价值。
    【解决方案2】:

    根据文档boto3

    “指定表中的项目数。DynamoDB 大约每六个小时更新一次此值。最近的更改可能不会反映在此值中。”

    import boto3
    
    dynamoDBResource = boto3.resource('dynamodb')
    table = dynamoDBResource.Table('tableName')
    print(table.item_count)
    

    或者你可以使用DescribeTable:

    import boto3
    
    dynamoDBClient = boto3.client('dynamodb')
    table = dynamoDBClient.describe_table(
        TableName='tableName'
    )
    print(table)
    

    【讨论】:

      【解决方案3】:

      如果要统计物品的数量:

      import boto3
      
      client = boto3.client('dynamodb','us-east-1')
      response = client.describe_table(TableName='test')
      print(response['Table']['ItemCount'])
      
      #ItemCount (integer) --The number of items in the specified table.
      # DynamoDB updates this value approximately every six hours.
      # Recent changes might not be reflected in this value.
      

      参考:Boto3 文档(在 describe_table() 中的 ItemCount 下)

      【讨论】:

      • 注意 - 这可能无法显示最近表格的准确结果,请参阅 here
      【解决方案4】:

      您可以使用它来获取整个表格项目的计数

      from boto.dynamodb2.table import Table
      
      dynamodb_table = Table('Users')
      dynamodb_table.count()  # updated roughly 6 hours
      

      参考这里:http://boto.cloudhackers.com/en/latest/ref/dynamodb2.html#module-boto.dynamodb2.table

      query_count 方法将根据您提供的索引返回项目计数。

      例如,

      from boto.dynamodb2.table import Table
      
      dynamodb_table = Table('Users')
      print dynamodb_table.query_count(
          index='first_name-last_name-index',  # Get indexes from indexes tab in dynamodb console
          first_name__eq='John',  # add __eq to your index name for specific search
          last_name__eq='Smith'  # This is your range key
      )
      

      您可以添加主索引或全局二级索引以及范围键。 可能的比较运算符

      __eq 表示相等

      __lt 小于

      __gt 表示大于

      __gte 表示大于或等于

      __lte 表示小于或等于

      __between for between

      __beginswith for 开始于

      之间的示例

      print dynamodb_table.query_count(
          index='first_name-last_name-index',  # Get indexes from indexes tab in dynamodb console
          first_name__eq='John',  # add __eq to your index name for specific search
          age__between=[30, 50]  # This is your range key
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-03
        • 1970-01-01
        • 2011-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多