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

时间:2016-05-25 22:14:12

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

我正在使用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-dynamodb-conditions

--------- ---------- EDIT

我也尝试使用旧方法:

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 个答案:

答案 0 :(得分:6)

从我的想法: 您的分区键是Number_Attribute,因此在执行gt时您无法执行query(您可以执行eq,就是这样。)

执行gt时,您可以为排序键执行betweenquery。它也被称为Range键,因为它"巧妙地"将项目放在一起,它可以在gt

中有效地betweenquery

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

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

请记住以下有关扫描的内容:

  

scan方法读取整个表中的每个项目,并返回表中的所有数据。您可以提供可选的filter_expression,以便仅返回符合条件的项目。但请注意,仅在扫描整个表格后才应用过滤器。

换句话说,与查询相比,这是一项代价高昂的操作。您可以在文档here中看到一个示例。

希望有所帮助!