Python 查询DynamoDB ISO-8601日期索引的小于条件

Python 查询DynamoDB ISO-8601日期索引的小于条件,python,python-2.7,amazon-dynamodb,boto,boto3,Python,Python 2.7,Amazon Dynamodb,Boto,Boto3,我有一个DynamoDB索引,存储iso-8601格式的日期,[即“2017-03-17]”。我想查询索引中小于某个日期的日期。[即datetime.now()-30天] 我相信这是亚马逊API文档提供的支持。我似乎遗漏了boto3语法的某些内容 我使用的是资源,而不是boto3中的客户端 我知道我可以使用epoch,但为了可读性,我想使用ISO格式 这是我的测试代码 import boto3 from boto3.dynamodb.conditions import Key, Attr dd

我有一个DynamoDB索引,存储iso-8601格式的日期,[即“2017-03-17]”。我想查询索引中小于某个日期的日期。[即datetime.now()-30天]

我相信这是亚马逊API文档提供的支持。我似乎遗漏了boto3语法的某些内容

我使用的是资源,而不是boto3中的客户端

我知道我可以使用epoch,但为了可读性,我想使用ISO格式

这是我的测试代码

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

ddb = boto3.resource('dynamodb')
_table = ddb.Table('TableWithDateIndex')

response2 = _table.query(
    IndexName='DeleteDate-index',
    KeyConditionExpression=Key('IndexDate').lt('2017-04-17')
)

print response2['Items']
在以下情况下失败:


botocore.exceptions.ClientError:调用查询操作时发生错误(ValidationException):查询键条件不受支持

,因此IndexDate是“DeleteDate索引”索引的哈希键。使用查询时,必须为哈希键提供相等条件,即
.eq()
。换句话说,您不能在查询中使用带有哈希键的比较运算符,如
lt
lte
gt
gte
等。在KeyConditionExpression中,这些运算符只能应用于范围键

以下是一段摘录:

在查询操作中,可以使用KeyConditionExpression参数 确定要从表或索引中读取的项。你必须 指定分区键名称和值作为相等条件。你 可以选择为排序键提供第二个条件(如果 现在)


您可以使用扫描操作代替查询。运行扫描时,允许您对FilterExpression中的任何字段使用任何运算符(或者根本不使用任何条件)。尽管您应该谨慎使用Scan,因为它可能是一个非常繁重的操作:它意味着读取表(或二级索引)中的每一项