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

时间:2014-02-02 20:27:30

标签: 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)

但是,我收到以下错误:

ValidationException: ValidationException: 400 Bad Request
{'message': 'Conditions can be of length 1 or 2 only', '__type': 'com.amazon.coral.validate#ValidationException'}

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

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

x = tab.query(hash__eq="2014-01-20 05:06:29")

我如何检索所有物品?

5 个答案:

答案 0 :(得分:31)

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

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

x    = tab.query()

x    = tab.scan()

我收到了表格中的所有项目。

答案 1 :(得分:7)

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

button

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

$.ajax({
   url: 'postar.php', // caminho para o script que vai processar os dados
   type: 'POST',
   data: form_data,
   cache: false,
   contentType: false,
   processData: false,
   success: function(response) {

       closeButton = '<button type="button" class="btn btn-default btn-flat" data-dismiss="modal" id = "closeButton">Close</button>'
       $('#cancelButton').hide();
       $('#submitButton').hide();
       $('.resp').html(response);
       $('.modal-footer').append(closeButton);
   },
   error: function(xhr, status, error) {
       alert(xhr.responseText);
   }
});

答案 2 :(得分:7)

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

这是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

答案 3 :(得分:0)

查询动态表时,我误用了KeyConditionExpression而不是FilterExpression时遇到了这个错误。

KeyConditionExpression仅应与分区键或排序键值一起使用。 如果您想进一步过滤结果,则应使用FilterExpression

但是请注意,使用FilterExpression会使用与没有读取相同的读取,因为它基于keyConditionExpression执行查询。然后,它将根据您的FilterExpression从结果中删除项目。

来源 Working with Queries

答案 4 :(得分:-1)

如果有人仍然需要解决方案,我就是这样做的查询:

def method_name(a, b)
    results = self.query(
      key_condition_expression: '#T = :t',
      filter_expression: 'contains(#S, :s)',
      expression_attribute_names: {
        '#T' => 'your_table_field_name',
        '#S' => 'your_table_field_name'
      },
      expression_attribute_values: {
        ':t' => a,
        ':s' => b
      }
    )
    results
  end