如何检查python boto3分页器是否未返回结果?

时间:2019-02-16 00:38:06

标签: python amazon-dynamodb boto3 paginator

这应该是一个简单的问题,但找不到答案。

我使用的是dynamodb分页器:

paginator = dynamoDbClient.get_paginator('query')
response_iterator = paginator.paginate(...)

我正在遍历结果:

for response in response_iterator:

我希望在未找到结果时不执行循环。不幸的是,我无法确定要检查什么以指示未找到结果。

请帮助。

谢谢。

1 个答案:

答案 0 :(得分:0)

通常,我编写自己的分页逻辑,如下所示:

while True:
    responseListPolicies = iam_client.list_policies(Marker=marker) if marker else iam_client.list_policies()
    truncatedListPolicies = responseListPolicies.get('IsTruncated')

    allPolicies = responseListPolicies.get('Policies')
    allPolicyArns += [policy.get('Arn') for policy in allPolicies]
    allPolicyNames += [policy.get('PolicyName') for policy in allPolicies]

    if not truncatedListPolicies:
        break
    marker = responseListPolicies.get('Marker')        
    print("Found truncated at marker " + marker)

但是,我最近遇到了通过boto3提供的pagination,并决定使用它。在那儿,我偶然发现了一个类似的问题,试图获取组策略。

这是我尝试过的内容的一个片段:

paginator = iam_client.get_paginator('list_group_policies')
res = paginator.paginate(GroupName=name, PaginationConfig={'MaxItems': 100000})
listOfAllPolicyNames += res.build_full_result().get('PolicyNames')

这引发了如下错误:

  

调用ListGroupPolicies操作时发生错误(NoSuchEntity):找不到名称为groupName的组。

我开始探索它。我所做的就是尝试查看在 res 对象上可用的方法。因此, dir(res)给出了这样的信息(部分结果如下所示):

 ...
 'build_full_result',
 'non_aggregate_part',
 'result_key_iters',
 'result_keys',
 'resume_token',
 'search']

我最终查看了 result_keys ,结果是这样的:

[{'type': 'field', 'children': [], 'value': 'PolicyNames'}]

我注意到children元素是一个空列表。因此,我尝试使用另一个我知道肯定会有一些内联策略的组名称进行上述分页。这次结果也一样。因此,最终,我意识到可能没有可以寻找的直接可用的钥匙。

所以最后不得不诉诸如下的异常处理方式:

try:
    paginator = iam_client.get_paginator('list_group_policies')
    res = paginator.paginate(GroupName=name, PaginationConfig={'MaxItems': 100000})
    res.build_full_result()
except Exception as e:
    if e.response['Error']['Code'] == 'NoSuchEntity':
        print("Entity does not exist")

不知道这有多大帮助。但这是我采取的方法。干杯!