python - Dynamodb 扫描分页没有按我的预期工作
问题描述
我正在使用下面的代码通过分页扫描 dynamodb 表,以从最多 20 条记录中提取 5 条记录。当我通过邮递员 GET 方法调用 api 时,它每次都提取相同的 5 条记录。这是否意味着我的 lambda 代码无法正常工作,或者我需要在邮递员中自定义我的 API 调用?
import boto3
import os
import json
def lambda_handler(event, context):
client = boto3.client('dynamodb', region_name='ap-southeast-1')
pagination_config={
"MaxItems":20,
"PageSize": 5
}
paginator = client.get_paginator('scan')
response_iterator = paginator.paginate(
TableName="Users",
PaginationConfig=pagination_config
)
for page in response_iterator:
Items = page['Items']
print(Items)
print("--------------------------")
from botocore.paginate import TokenEncoder
encoder = TokenEncoder()
for page in response_iterator:
if "LastEvaluatedKey" in page:
encoded_token = encoder.encode({"ExclusiveStartKey": page["LastEvaluatedKey"]})
pagination_config = {
"MaxItems": 20,
"PageSize": 5,
"StartingToken": encoded_token
}
Items = page['Items']
return {
'statusCode': 200,
'headers': {},
'body': json.dumps(Items)
}
解决方案
分页时,您需要从LastEvaluatedKey
上一次调用的开始。在发布的代码中LastEvaluatedKey
,一遍又一遍地使用相同的代码,这将不允许分页并产生相同的结果。这是一个可以在本地运行的示例
import os
import json
from botocore.paginate import TokenEncoder
def lambda_handler(event, context):
key= event['key']
client = boto3.client('dynamodb', region_name='ap-southeast-1')
if not key:
pagination_config = {"MaxItems": 20, "PageSize": 5}
else:
encoder = TokenEncoder()
encoded_token=encoder.encode({'ExclusiveStartKey': {'id': {'S': key}}})
pagination_config = {"MaxItems": 20, "PageSize": 5, "StartingToken": encoded_token }
paginator = client.get_paginator('scan')
response_iterator = paginator.paginate(
TableName="Users",
PaginationConfig=pagination_config
)
for page in response_iterator:
Items = page['Items']
return {
'statusCode': 200,
'headers': {},
'body': json.dumps(Items),
'LastEvaluatedKey' : page["LastEvaluatedKey"]
}
在响应中,最后评估的密钥将如下所示:
"LastEvaluatedKey": {"id": {"S": "???????"}}}"
请务必将其用于您的下一个分页。
推荐阅读
- ios - 如何在 ios swift 的 twilio 聊天推送通知有效负载中添加额外参数
- typescript - 如果我导入文件,TypeScript 找不到在类型声明中声明的变量
- css - 更改光标类型 - 材质 UI 扩展面板
- python - Python Selenium 错误:元素不可交互
- python - Python\Marshmallow:TypeError:__init__() 缺少 1 个必需的位置参数:'cls_or_instance'
- excel - Excel:计算值是否在工作表中至少出现一次
- javascript - 如何取消修补 Javascript 对象中的方法?特别是 XMLHttpRequest.open
- c++ - 我想改变条件,但我不能
- sql - 如何从两个不同的表中计算和和减法
- django - django.extra() 中是否有左连接,它可以帮助我在 django 中加入没有任何关系的表