【问题标题】:Python Script to query from DynamoDb not giving all items从 DynamoDb 查询的 Python 脚本不提供所有项目
【发布时间】:2019-01-11 19:26:09
【问题描述】:

我已经编写了以下 python 代码来从表中获取数据,但它没有获取我想要的所有项目。当我查看 DynamoDb 的 AWS 控制台页面时,与从脚本中获得的相比,我可以看到更多的条目。

from __future__ import print_function # Python 2/3 compatibility
import boto3
import json
import decimal
from datetime import datetime
from boto3.dynamodb.conditions import Key, Attr
import sys

# Helper class to convert a DynamoDB item to JSON.
class DecimalEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, decimal.Decimal):
            if o % 1 > 0:
                return float(o)
            else:
                return int(o)
        return super(DecimalEncoder, self).default(o)

dynamodb = boto3.resource('dynamodb', aws_access_key_id = '',
        aws_secret_access_key = '',
        region_name='eu-west-1', endpoint_url="http://dynamodb.eu-west-1.amazonaws.com")

mplaceId = int(sys.argv[1])
table = dynamodb.Table('XYZ')

response = table.query(
    KeyConditionExpression=Key('mplaceId').eq(mplaceId)
)

print('Number of entries found ', len(response['Items']))

我也从 aws 控制台做了同样的事情。按 mplaceId 查询。

它发生的任何原因?

【问题讨论】:

标签: amazon-web-services amazon-dynamodb


【解决方案1】:

dynamodb.Table.query() 最多返回 1MB 的数据。来自boto3 documentation

单个Query 操作将读取最多设置的最大项目数(如果使用Limit 参数)或最多1 MB 的数据,然后使用FilterExpression 对结果应用任何过滤。如果响应中存在LastEvaluatedKey,则需要对结果集进行分页。有关更多信息,请参阅 Amazon DynamoDB 开发人员指南中的Paginating the Results

这实际上不是boto3-limitation,而是底层query-API 的限制。

您可以使用boto3built-in pagination ,而不是自己实现分页。以下是boto3提供的paginator for querying DynamoDB tables的使用示例:

import boto3
from boto3.dynamodb.conditions import Key

dynamodb_client = boto3.client('dynamodb')
paginator = dynamodb_client.get_paginator('query')
page_iterator = paginator.paginate(
    TableName='XYZ',
    KeyConditionExpression='mplaceId = :mplaceId',
    ExpressionAttributeValues={':mplaceId': {'S' : mplaceid}}
)

for page in page_iterator:
    print(page['Items'])

【讨论】:

  • 1MB 大小限制也适用于表扫描。这是一个有效的问题,因为数据存储的常见行为是为数量或记录设置返回限制,特别是在明确说明限制数量时。见stackoverflow.com/questions/46617575/…
  • 问题是这有KeyConditionExpress,不返回所有结果,寻找一种方法来返回所有结果无条件或不考虑条件@Dunedan
  • 据我所知,paginate 方法不支持使用 Key 或 Attr 表达式对象,这意味着它不是直接替换,这迫使您必须手动构建字符串查询。此外,您的示例不包括 TableName 参数。
  • @AlastairMcCormack:感谢您的评论。我编辑了我的答案以解决上述问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 2019-11-21
  • 2020-11-07
  • 2019-09-05
相关资源
最近更新 更多