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

Python调用AWS DynamoDB scan接口用LastEvaluatedKey仍无法拉取全量数据求助

DynamoDB全表扫描问题修复方案

核心问题排查

你的代码存在3个直接导致无法获取全量数据的逻辑错误:

  • 缩进语法错误:while循环内for item in items:后的两行代码没有缩进,会直接触发语法异常终止程序,后续分页请求根本没有执行,第一次扫描返回的数据小于1MB时自然不会返回LastEvaluatedKey,你会误判为已经拉取完全部数据。
  • 分页数据未处理:仅处理了第一次扫描返回的记录,后续分页拿到的结果没有合并到总列表、也没有打印输出,无法感知到后续分页数据的存在。
  • 计数逻辑失效:queryCount的计数逻辑完全混乱,既不能统计扫描请求次数,也不能统计总记录数,会误导对执行结果的判断。

其他可能触发同类问题的场景自查

如果修复上述逻辑后依然存在问题,可排查以下场景:

  • 若你实际代码中添加了FilterExpression过滤参数,DynamoDB会先扫描1MB数据再过滤,若该1MB内无符合条件的记录会直接返回空Items,扫描完全表后就不会返回LastEvaluatedKey,此时你拿到的结果为空但表中实际存在符合条件的记录,需要持续分页直到LastEvaluatedKey消失,不能以Items是否为空作为终止条件。
  • 若你在scan时指定了Limit参数,单次返回数量达到阈值时也会返回LastEvaluatedKey,未做分页处理就会遗漏数据。

修复后可直接运行的代码

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

dynamodb = boto3.resource('dynamodb')

def lambda_handler(event, context):
    table = dynamodb.Table('Your_Table_Name')
    # 存储全量扫描结果
    all_items = []
    # 统计扫描请求次数
    scan_count = 0
    # 分页起始标记
    exclusive_start_key = None

    while True:
        scan_count += 1
        scan_params = {}
        if exclusive_start_key:
            scan_params['ExclusiveStartKey'] = exclusive_start_key
        
        response = table.scan(**scan_params)
        current_items = response['Items']
        all_items.extend(current_items)

        # 调试输出,不需要可以删除
        print(f"第{scan_count}次扫描,当前页返回{len(current_items)}条记录,累计已扫描{response['ScannedCount']}条")
        for item in current_items:
            print(item)

        # 无下一页时终止循环
        if 'LastEvaluatedKey' not in response:
            break
        exclusive_start_key = response['LastEvaluatedKey']
    
    print(f"扫描结束,总请求次数:{scan_count},全表有效记录总数:{len(all_items)}")
    return {
        'statusCode': 200,
        'body': json.dumps(f"扫描完成,共获取{len(all_items)}条记录")
    }

内容的提问来源于stack exchange,提问作者AWS_explorer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:57:02