簡體   English   中英

如何檢查 python boto3 分頁器是否未返回任何結果?

[英]How do I check if a python boto3 paginator returned no results?

這應該是一個簡單的問題,但就是找不到答案。

我正在使用 dynamodb 分頁器:

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

我正在遍歷結果:

for response in response_iterator:

我希望在沒有找到結果時不執行循環。 不幸的是,它是,我不知道要檢查什么來表明沒有找到結果。

請幫忙。

謝謝。

通常,我會編寫自己的分頁邏輯,如下所示:

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對象上提供了哪些方法。 因此, 目錄給出了類似以下內容(部分結果如下所示):

 ...
 '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")

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

每個頁面都有一個KeyCount鍵,它告訴您每個頁面中包含多少個 S3 對象。 如果分頁器的第一頁的KeyCount0 ,那么您就知道它是空的。

像這樣:

paginator = client.get_paginator('list_objects_v2')
for page in paginator.paginate(Bucket='my-bucket', Prefix='my-prefix'):
  if page['KeyCount'] == 0:
    # The paginator is empty (and this should be the first page)

如果您確實需要將KeyCount用於其他目的(例如,0 可能意味着您已經處理了一堆頁面,然后最后一個頁面為空),您可以這樣做:

for i, page in enumerate(paginator.paginate(Bucket='my-bucket', Prefix='my-prefix')):
  if i == 0 and page['KeyCount'] == 0:
    # The paginator is empty
  else:
    # Paginator is not empty

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM