簡體   English   中英

使用查詢從 DynamoDB 中檢索所有項目?

[英]Retrieve all items from DynamoDB using query?

我正在嘗試使用查詢檢索 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")

我怎樣才能檢索所有項目?

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

您不能在不指定特定哈希鍵的情況下對表使用查詢方法。 使用的方法是掃描。 所以如果我替換:

x    = tab.query()

x    = tab.scan()

我拿到了桌子上的所有物品。

我在 groovy 但它會給你一個提示。 錯誤 :

{'message': 'Conditions can be of length 1 or 2 only'}

告訴你你的關鍵條件可以是 length 1 -> hashKey only ,或 length 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)

由於表格的分頁,.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

當我在查詢 dynamodb 表時誤用KeyConditionExpression而不是FilterExpression時,我遇到了這個錯誤。

KeyConditionExpression應該只與分區鍵或排序鍵值一起使用。 當您想進一步過濾結果時,應使用FilterExpression

但是請注意,使用FilterExpression使用與不使用時相同的讀取,因為它根據keyConditionExpression執行查詢。 然后根據您的FilterExpression從結果中刪除項目。

使用查詢的

如果有人仍然需要解決方案,我就是這樣做的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM