带有 boto3 (Dynamodb) 的 Flask 应用程序 - 数据检索不一致

问题描述 投票:0回答:1

我有一个 AWS IoT 配置规则,用于将消息从 MQTT 保存到 DynamoDB v2 表。保存过程工作正常 - 我有一个 arduino 运行代码,将数据发送到 MQTT,并通常将数据保存到 DynamoDb。

我还有一个在 EC2 上运行的应用程序(flask)。问题是数据检索完全不一致。目前我正在写作,如果我使用 AWS 控制台执行扫描,我有 58 个条目(我必须单击“检索下一页”,否则我只会看到 50 个条目)。但是当我调用我的应用程序时,有时我会看到 50 个项目,有时 54 个...有时甚至 58 个!

如果我重新启动 apache2 服务器,似乎会正确计数。

下面是我正在运行的代码。有什么想法吗?

from flask import Flask
import boto3
from boto3.dynamodb.conditions import Key, Attr
from datetime import datetime

AWS_ACCESS_KEY_ID = 'key'
AWS_SECRET_ACCESS_KEY = 'access_key'
REGION_NAME = 'region'

dynamodb = boto3.resource(
    'dynamodb',
    aws_access_key_id     = AWS_ACCESS_KEY_ID,
    aws_secret_access_key = AWS_SECRET_ACCESS_KEY,
    region_name           = REGION_NAME
)

table = dynamodb.Table('my_db')

lastEvaluatedKey = None
items = []

#I'm doing this below to get all pages
while True:
    if lastEvaluatedKey == None:
        response = table.scan()
    else:
        response = table.scan(
        ExclusiveStartKey=lastEvaluatedKey
    )

    items.extend(response['Items'])

    if 'LastEvaluatedKey' in response:
        lastEvaluatedKey = response['LastEvaluatedKey']
    else:
        break

#localDateTime is my sortKey
sorted_items = sorted(items, key=lambda x: datetime.strptime(x['localDateTime'], '%Y-%m-%dT%H:%M:%S'), reverse=True)

app = Flask(__name__)
@app.route('/')

def my_app():
    return sorted_items
if __name__ == '__main__':
  app.run()

我正在尝试从 dynamoDb 获取所有数据

flask amazon-dynamodb boto3
1个回答
0
投票

我认为你的分页逻辑有问题。尝试这个实现:

response = table.scan()
data = response['Items']

while 'LastEvaluatedKey' in response:
    response = table.scan(ExclusiveStartKey=response['LastEvaluatedKey'])
    data.extend(response['Items'])
© www.soinside.com 2019 - 2024. All rights reserved.