当前位置: 首页 > 知识库问答 >
问题:

AWS DynamoDB Python-无法识别boto3 Key()方法(查询)

殷耀
2023-03-14

我使用Lambda(Python)查询我的DynamoDB数据库。我正在使用boto3库,我能够进行“等效”查询:

这个脚本的工作原理是:

import boto3
from boto3.dynamodb.conditions import Key, Attr
import json

def create_list(event, context):
    resource = boto3.resource('dynamodb')
    table = resource.Table('Table_Name')

    response = table.query(
        TableName='Table_Name',
        IndexName='Custom-Index-Name',
        KeyConditionExpression=Key('Number_Attribute').eq(0)
    )
    return response

但是,当我将查询表达式更改为以下内容时:

KeyConditionExpression=Key('Number_Attribute').gt(0)

我得到一个错误:

"errorType": "ClientError",
  "errorMessage": "An error occurred (ValidationException) when calling the Query operation: Query key condition not supported"

根据该[1]资源,“gt”是Key()的方法。有人知道这个库是否已经更新,或者除了“eq”之外还有什么其他方法可用吗?

[1] http://boto3.readthedocs.io/en/latest/reference/customizations/dynamodb.html#ref-发电机工况

---------编辑----------

我还尝试了旧方法,使用:

response = client.query(
        TableName = 'Table_Name',
        IndexName='Custom_Index',
        KeyConditions = {
            'Custom_Number_Attribute':{
                'ComparisonOperator':'EQ',
                'AttributeValueList': [{'N': '0'}]
            }
        }
    )

这是有效的,但当我尝试:

response = client.query(
            TableName = 'Table_Name',
            IndexName='Custom_Index',
            KeyConditions = {
                'Custom_Number_Attribute':{
                    'ComparisonOperator':'GT',
                    'AttributeValueList': [{'N': '0'}]
                }
            }
        )

...它不起作用。

为什么EQ是在这些情况下唯一有效的方法?我不确定我在文档中遗漏了什么。

共有1个答案

赵光赫
2023-03-14

根据我的想法:您的分区键是Number_属性,因此在执行查询时,您不能执行gt(您可以执行eq,就是这样。)

在执行查询时,您可以对排序键执行gtbetween。它也被称为范围键,因为它“巧妙地”将项目放在彼此相邻的位置,所以它提供了在查询中高效地执行gt之间的的可能性

现在,如果您想对分区键执行between,则必须使用scan,如下所示:

Key('Number_Attribute').gt(0)
response = table.scan(
    FilterExpression=fe
)

请记住以下有关扫描的事项:

scan方法读取整个表中的每个项目,并返回表中的所有数据。您可以提供一个可选的filter_表达式,以便只返回与您的条件匹配的项。但是,请注意,过滤器仅在扫描整个表后应用。

换句话说,与查询相比,这是一个有点昂贵的操作。您可以在这里的留档中看到一个示例。

希望有帮助!

 类似资料:
  • 当我在GSI上查询时,我对Amazon DynamoDBv2的Amazon DynamoDBAsync.query异步请求的实现返回代码400“查询条件错过了关键模式元素......”。 我尝试使用DynamoDBAttribute名称(“myAttr”)和GSI的实际索引名称(“idx\u global\u myAttr”),并收到相同的错误代码。这与Docker的图片“amazon/dynam

  • 我有以下序列

  • 我不确定这是否是一个与我没有这台计算机的管理权限有关的问题。任何帮助,以便我可以进一步排除故障,将非常感谢! 谢谢

  • 问题内容: 我正在使用石英进行日程安排。 它接受5个参数。(秒,分钟,小时,daysOfMonth,月份)。 当我通过第四个参数作为“ 09”。Eclipse给我错误“ int类型的文字八进制09(数字9)超出范围”。 但是,当我将第四个参数作为“ 9”而不是“ 09”传递时,它起作用了。 谁能解释这个错误? 问题答案: 在Java中,如果要定义整数,则前导“ 0”将表示您正在以八进制定义数字

  • 我面临的问题是在java中使用hibernate为postgres表执行以下查询。 该查询由使用内部连接从3个表中检索数据组成。 QryJourney=“选择journey.id、journey.operatingday、journey.linename、journey.scheduledeparturestopname、journeydetail.stopname、journeydetail.l

  • 我有一个带有左连接的SELECT语句,连接的表是子查询。Oracle无法识别第二个子查询中第一个子查询的别名。它适用于DB2,但不适用于Oracle。我如何实现它或重写我的查询? Oracle错误消息:ORA-00904:“B”。“C3”:无效标识符