使用查询从DynamoDB检索所有项目?

dla*_*ser 16 python boto amazon-dynamodb

我试图使用查询检索dynamodb表中的所有项目.以下是我的代码:

import boto.dynamodb2
from boto.dynamodb2.table import Table
from time import sleep

c    = boto.dynamodb2.connect_to_region(aws_access_key_id="XXX",aws_secret_access_key="XXX",region_name="us-west-2")

tab  = Table("rip.irc",connection=c)

x    = tab.query()

for i in x:
    print i
    sleep(1)
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

ValidationException: ValidationException: 400 Bad Request
{'message': 'Conditions can be of length 1 or 2 only', '__type': 'com.amazon.coral.validate#ValidationException'}
Run Code Online (Sandbox Code Playgroud)

我所拥有的代码非常简单,并且不受boto dynamodb2文档的影响,所以我不确定为什么会出现上述错误.任何见解都将受到赞赏(新的,有点失去).谢谢

编辑:我有一个哈希键和一个范围键.我能够通过特定的哈希键进行查询.例如,

x = tab.query(hash__eq="2014-01-20 05:06:29")
Run Code Online (Sandbox Code Playgroud)

我怎样才能检索所有物品?

dla*_*ser 34

好吧,想通了.如果有人需要:

如果不指定特定的哈希键,则无法在表上使用查询方法.使用的方法是扫描.所以,如果我更换:

x    = tab.query()
Run Code Online (Sandbox Code Playgroud)

x    = tab.scan()
Run Code Online (Sandbox Code Playgroud)

我收到了表格中的所有物品.

  • 这不是一个解决方案,你不会使用扫描你的应用程序逻辑,它是非常昂贵的!您应该重新考虑索引并使用query或get_item! (9认同)
  • 扫描是小表的合理解决方案.资料来源:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScanGuidelines.html (7认同)
  • 由于表格分页,.scan() 也不会自动返回表格中的所有元素,每个响应有 1mB 的限制。之后,您将需要使用“LastEvaluatedKey”属性进行后续扫描 (3认同)

Eph*_*ris 9

由于表格的分页,.scan() 不会自动返回表格的所有元素。有 1Mb 最大响应限制Dynamodb 最大响应限制

这是 boto3 扫描的递归实现:

import boto3
dynamo = boto3.resource('dynamodb')


def scanRecursive(tableName, **kwargs):
        """
        NOTE: Anytime you are filtering by a specific equivalency attribute such as id, name 
        or date equal to ... etc., you should consider using a query not scan

        kwargs are any parameters you want to pass to the scan operation
        """
        dbTable = dynamo.Table(tableName)
        response = dbTable.scan(**kwargs)
        if kwargs.get('Select')=="COUNT":
            return response.get('Count')
        data = response.get('Items')
        while 'LastEvaluatedKey' in response:
            response = kwargs.get('table').scan(ExclusiveStartKey=response['LastEvaluatedKey'], **kwargs)
            data.extend(response['Items'])
        return data
Run Code Online (Sandbox Code Playgroud)

  • 为什么不直接使用预构建的[扫描分页器](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Paginator.Scan)? (2认同)

Vad*_*dim 7

我很时髦,但它会给你一个暗示.错误:

{'message': 'Conditions can be of length 1 or 2 only'}
Run Code Online (Sandbox Code Playgroud)

告诉你你的关键条件可以是长度1 - > hashKey,或长度2 - > hashKey + rangeKey.所有在键顶部查询的内容都会引发此错误.出现此错误的原因是:您尝试运行搜索查询但使用键条件查询.您必须添加单独的filterCondition才能执行查询.我的代码

    String keyQuery = " hashKey = :hashKey and rangeKey between :start and :end "
    queryRequest.setKeyConditionExpression(keyQuery)// define key query
    String filterExpression = " yourParam = :yourParam "
    queryRequest.setFilterExpression(filterExpression)// define filter expression
    queryRequest.setExpressionAttributeValues(expressionAttributeValues)
    queryRequest.setSelect('ALL_ATTRIBUTES')
    QueryResult queryResult = client.query(queryRequest)
Run Code Online (Sandbox Code Playgroud)