【问题标题】:KeyError ['Item'] in DynamoDB get_item PythonDynamoDB get_item Python 中的 KeyError ['Item']
【发布时间】:2020-07-03 09:47:07
【问题描述】:

我已将 AWS Lambda 连接到 DynamoDB,并且没有任何连接问题。 每次更新数据库时都会运行 lambda Python 代码。但是我在response['Item'] 中遇到了一个关键错误。我已经阅读了文档,但都是一样的,我很困惑为什么会出现错误。几乎在每个网站上都有response['Item'],而且我的表也不是空的,它由那个项目组成。 专门针对浮点值而不是整数值的问题。

from decimal import Decimal
from boto3.dynamodb.conditions import Key

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

table = dynamodb.Table('My table name')

def lambda_handler(event, context):
    
    response = table.get_item(
        Key = {

            "Time": Decimal(4193082887.620961)

        }
           )
    
    print(response['Item'])

而 lambda 控制台中出现的错误是

[ERROR] KeyError: 'Item'
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 26, in lambda_handler
    print(response['Item'])

实际上我想要一个 python 程序,它可以为我提供表中的最新条目,但测试从获取项目开始。如果你能告诉我如何从 python 中的表中获取最新条目,那很好。我只是将我的数据从浮点值编辑为整数值,现在它完美地给了我时间的整数数据,但是当我我对浮点值做同样的事情,它给了我错误。它肯定会用浮点数和小数做一些事情。

【问题讨论】:

  • 你的桌子是什么样子的?
  • 它是一个普通的 dynamodb 表,有 3 个列。时间,纬度,经度
  • 也连接到IOT核心规则。就是这样
  • 如果该键不存在,则没有分区键为“Time”且值为“4193082887.620961”的项目。您是否在控制台中验证了某个项目具有此值?
  • 是的,值在那里,即使不是,它也应该返回一个空值而不是错误。

标签: python amazon-web-services aws-lambda amazon-dynamodb keyerror


【解决方案1】:

Dynamo 不像 RDMS..

假设您的某个 cmets 中提到的 RequestId 是表的哈希键,则 GetItem()(和 Query())仅适用于 RequestId。您可以 Scan() 整个表来查找 Time=4193082887.620961,但这会很昂贵,因为会读取整个表。

您需要做的是设置一个Global Secondary Index (GSI),它使用时间作为哈希键。现在您可以 Query() 获取您想要的记录的 GSI。

但是,您后来的一位 cmets 提到您真的很想添加最后一行,但实际上并不知道时间。

在这种情况下,您需要一个虚拟哈希键值并将时间用作排序键,而不是使用 Time 作为 GSI 中的哈希键。现在您只需使用哈希键并设置 "ScanIndexForward" = false 和 `Limit=1' 属性来查询() GSI。

这将为您提供最新的记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    相关资源
    最近更新 更多