我正在编写一个 ETL 作业,在该作业中,我GitHub
在数据仓库中的存储库中保留更新的提交、拉取请求和文件列表。我目前正在存储并传递etags
给各种迭代器,但我认为我不理解如何正确地做到这一点。
我也很难理解它到底在object.refresh(conditional=True)
做什么。如果我遍历 repo 上的所有提交,然后调用commit.refresh(conditional=True)
每个提交,我会收到一个 304 异常来处理,所以我知道不要将该提交包含在数据仓库中,因为它没有更改?拉取请求也是如此。当我打电话时repository.refresh(conditional=True)
,它似乎忽略了回购中的新提交。
如果我传递一个etag
to repo.iter_commits
,它会只返回修改过的提交,还是如果有任何更改,它是否返回 repo 的所有提交?
这是我目前使用的基本工作流程:
from github3 import login
gh = login(token='access_token')
repos = (repo.refresh(conditional=True) for repo in gh.iter_repos(etag='previous_etag'))
commit_iters = (commit_iter for repo in repos for commit_iter in repo.iter_commits(etag='prev_etag'))
for commit_iter in commit_iters:
for commit in commit_iter:
commit.refresh(conditional=True)
# pull various attributes, write to file, etc...
我将每个迭代器包装在一个包装类中,该类处理检索先前etags
的、迭代后的存储etags
和检查速率限制。
我的首要目标是拉取自我上次请求以来发生更改的任何新提交/拉取请求。我假设那时我想从数据库中删除现有条目并使用新条目进行更新。
github3.py
使用API实现这一目标的正确和最有效的方法是什么?
编辑:我再次检查了文档,并且有一个since
参数可以解决我的提交问题。所以我只需要知道如何正确使用 etags 来拉取更新的拉取请求数据。