Azure DevOps API WIQL 获取最大最大工作项 ID
Azure DevOps API WIQL get maximum max work item id
我正在使用 WIQL 查询 Azure DevOps 中的工作项列表。但是,Azure DevOps 将 return 在单个查询中最多处理 20000 个工作项。如果查询结果包含超过 20000 个项目,则会 return 编辑错误代码而不是工作项目。为了获得与我的查询匹配的所有工作项的列表,我修改了查询以过滤我的 ID,然后循环构建具有多个查询的工作项列表。问题是显然没有办法知道我何时到达循环结束,因为我不知道系统中的最大工作项 ID。
idlist = []
max_items_per_query = 19000
counter = 0
while not done:
wiql = ("SELECT [System.Id] FROM WorkItems WHERE [System.WorkItemType] IN ('User Story','Bug')
AND [System.AreaPath] UNDER 'mypath' AND System.ID >= count AND System.ID < counter + max_items".format(counter, counter + max_items_per_query))
url = base_url+'wiql'
params = {'api-version':'4.0'}
body = {'query':wiql}
request = session.post(url, auth=('',personal_access_token), params=params, json=body)
response = request.json()
newItems = [w['id'] for w in response['workItems']]
idlist.extend(newItems)
if not newItems:
done = True
这在大多数情况下都有效,但如果循环在指定区域路径下的工作项 ID 中遇到间隙,则会过早退出。理想情况下,如果有一种方法可以查询系统中的最大工作项 ID,然后在计数器达到该值时使用该数字退出,我就可以完成这项工作。但是,我找不到办法做到这一点。有没有一种方法可以查询这个数字或其他可能的解决方案,使我能够获得符合特定条件的所有工作项的列表?
您可以使用$top
参数获取最后一个。
类似下面的内容(这只是示例 - 您可以将其扩展到您的查询)
SELECT [System.Id] FROM workitems WHERE [System.Id] > 0 ORDER BY [System.Id] DESC with $top = 1
这将 return 最大系统 ID - 因为它按降序排列。
建议:
您也可以像下面这样更改您的逻辑:
SELECT [System.Id] FROM workitems WHERE [System.Id] > 0 ORDER BY [System.Id] ASC with $top = 5000
获取第 5000 项 System.Id
,我们假设它是 5029
下一个查询是:
SELECT [System.Id] FROM workitems WHERE [System.Id] > 5029 ORDER BY [System.Id] ASC with $top = 5000
您将获得从系统 ID- 5029 开始的下 5000 个项目。
以上逻辑可以循环
对于循环的退出情况,您可以检查 returned 的项目数作为迭代的一部分 - 如果它小于 5000,则那将是迭代的结束。
我正在使用 WIQL 查询 Azure DevOps 中的工作项列表。但是,Azure DevOps 将 return 在单个查询中最多处理 20000 个工作项。如果查询结果包含超过 20000 个项目,则会 return 编辑错误代码而不是工作项目。为了获得与我的查询匹配的所有工作项的列表,我修改了查询以过滤我的 ID,然后循环构建具有多个查询的工作项列表。问题是显然没有办法知道我何时到达循环结束,因为我不知道系统中的最大工作项 ID。
idlist = []
max_items_per_query = 19000
counter = 0
while not done:
wiql = ("SELECT [System.Id] FROM WorkItems WHERE [System.WorkItemType] IN ('User Story','Bug')
AND [System.AreaPath] UNDER 'mypath' AND System.ID >= count AND System.ID < counter + max_items".format(counter, counter + max_items_per_query))
url = base_url+'wiql'
params = {'api-version':'4.0'}
body = {'query':wiql}
request = session.post(url, auth=('',personal_access_token), params=params, json=body)
response = request.json()
newItems = [w['id'] for w in response['workItems']]
idlist.extend(newItems)
if not newItems:
done = True
这在大多数情况下都有效,但如果循环在指定区域路径下的工作项 ID 中遇到间隙,则会过早退出。理想情况下,如果有一种方法可以查询系统中的最大工作项 ID,然后在计数器达到该值时使用该数字退出,我就可以完成这项工作。但是,我找不到办法做到这一点。有没有一种方法可以查询这个数字或其他可能的解决方案,使我能够获得符合特定条件的所有工作项的列表?
您可以使用$top
参数获取最后一个。
类似下面的内容(这只是示例 - 您可以将其扩展到您的查询)
SELECT [System.Id] FROM workitems WHERE [System.Id] > 0 ORDER BY [System.Id] DESC with $top = 1
这将 return 最大系统 ID - 因为它按降序排列。
建议:
您也可以像下面这样更改您的逻辑:
SELECT [System.Id] FROM workitems WHERE [System.Id] > 0 ORDER BY [System.Id] ASC with $top = 5000
获取第 5000 项 System.Id
,我们假设它是 5029
下一个查询是:
SELECT [System.Id] FROM workitems WHERE [System.Id] > 5029 ORDER BY [System.Id] ASC with $top = 5000
您将获得从系统 ID- 5029 开始的下 5000 个项目。
以上逻辑可以循环
对于循环的退出情况,您可以检查 returned 的项目数作为迭代的一部分 - 如果它小于 5000,则那将是迭代的结束。