Python Boto3中DynamoDB日期范围查询报错问题咨询
问题分析与解决方案
错误原因
你使用的是本地二级索引(LSI),这类索引强制与主表共享分区键(Id)。执行LSI的Query操作时,KeyConditionExpression必须同时指定分区键Id的匹配条件,再搭配排序键CrawledAt的范围条件。你当前仅提供了CrawledAt的BETWEEN条件,违反了LSI的查询规则,导致DynamoDB解析时抛出类型错误。
解决方案
要实现「不指定Id,仅按CrawledAt日期范围查询」的需求,需将索引改为全局二级索引(GSI):
- 重新创建索引,将
CrawledAt设为GSI的分区键(无需关联主表的Id) - 确保查询时指定的
IndexName为该GSI的名称
修正后的查询代码(同时修正了无效日期2025-11-31为2025-11-30):
request = { "TableName": "sflnd00001-test", "IndexName": "CrawledAt-index", # 此处为GSI的名称 "ConsistentRead": False, "ProjectionExpression": "Name", "KeyConditionExpression": "CrawledAt between :v_start and :v_end", "ExpressionAttributeValues": { ":v_start": {"S": "2020-01-31T00:00:00.000Z"}, ":v_end": {"S": "2025-11-30T00:00:00.000Z"} } } response = table.query(**request)
额外优化
如果使用的是boto3资源客户端,可省略手动指定类型的{"S": "..."}格式,boto3会自动处理类型转换:
request = { "TableName": "sflnd00001-test", "IndexName": "CrawledAt-index", "ConsistentRead": False, "ProjectionExpression": "Name", "KeyConditionExpression": "CrawledAt between :v_start and :v_end", "ExpressionAttributeValues": { ":v_start": "2020-01-31T00:00:00.000Z", ":v_end": "2025-11-30T00:00:00.000Z" } }
内容的提问来源于stack exchange,提问作者DevAra
相关产品推荐
相关产品推荐

