You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:01:11