如何用GitHub GraphQL实现增量加载Issues(替代REST的since参数)
实现GitHub GraphQL Issues增量加载的正确方式
GitHub GraphQL的issues字段并不支持直接传入since参数,你之前遇到的错误就是因为这个原因。要实现增量加载,需要通过filter参数结合时间条件来过滤数据,以下是具体方案:
方案1:按创建时间过滤新Issue
通过filter.created.since指定时间范围,只拉取该时间之后创建的Issue。修改后的查询如下:
ISSUES_QUERY = """ query($owner: String!, $name: String!, $issues_per_page: Int!, $first_reactions: Int!, $first_comments: Int!, $page_after: String, $since: DateTime!) { repository(owner: $owner, name: $name) { issues( first: $issues_per_page, orderBy: {field: CREATED_AT, direction: DESC}, after: $page_after, filter: {created: {since: $since}} ) { totalCount pageInfo { endCursor hasNextPage } nodes { id number createdAt # 其他你需要的字段 } } } } """
方案2:按更新时间过滤(含新增和修改的Issue)
如果需要同步新创建和已更新的Issue,改用filter.updated.since:
ISSUES_QUERY = """ query($owner: String!, $name: String!, $issues_per_page: Int!, $first_reactions: Int!, $first_comments: Int!, $page_after: String, $since: DateTime!) { repository(owner: $owner, name: $name) { issues( first: $issues_per_page, orderBy: {field: UPDATED_AT, direction: DESC}, after: $page_after, filter: {updated: {since: $since}} ) { totalCount pageInfo { endCursor hasNextPage } nodes { id number createdAt updatedAt # 其他你需要的字段 } } } } """
关键注意事项
- 变量类型:
$since的类型是DateTime!,必须传入ISO 8601格式的时间字符串(例如2024-05-20T00:00:00Z,Z表示UTC时区),避免时区偏差。 - 增量时间记录:需要保存上次同步的时间戳(可存在BigQuery的元数据表、本地配置文件或缓存服务中),每次运行时读取该时间作为
$since的值,运行结束后更新为当前UTC时间。 - 分页处理:即使过滤后数据量较少,仍需通过
page_after和pageInfo.endCursor处理分页,直到pageInfo.hasNextPage为false时停止拉取。
内容的提问来源于stack exchange,提问作者Aman Gupta
相关产品推荐
相关产品推荐

