我正在使用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是唯一适用于这些情况的方法?我不确定我在文档中遗漏了什么。
答案 0 :(得分:6)
从我的想法:
您的分区键是Number_Attribute,因此在执行gt
时您无法执行query
(您可以执行eq
,就是这样。)
执行gt
时,您可以为排序键执行between
或query
。它也被称为Range键,因为它"巧妙地"将项目放在一起,它可以在gt
between
和query
现在,如果您想对分区密钥执行between
,则必须使用scan
,如下所示:
Key('Number_Attribute').gt(0)
response = table.scan(
FilterExpression=fe
)
请记住以下有关扫描的内容:
scan方法读取整个表中的每个项目,并返回表中的所有数据。您可以提供可选的filter_expression,以便仅返回符合条件的项目。但请注意,仅在扫描整个表格后才应用过滤器。
换句话说,与查询相比,这是一项代价高昂的操作。您可以在文档here中看到一个示例。
希望有所帮助!