【发布时间】:2017-08-30 00:53:36
【问题描述】:
我正在编写一个 ETL 作业,我在数据仓库中保存来自 GitHub 存储库的提交、拉取请求和文件的更新列表。我目前正在存储 etags 并将其传递给各种迭代器,但我认为我不明白如何正确地做到这一点。
我也很难理解object.refresh(conditional=True) 到底在做什么。如果我遍历 repo 上的所有提交,然后在每个提交上调用commit.refresh(conditional=True),我会收到一个 304 异常来处理,所以我知道不要将该提交包含在数据仓库中,因为它没有更改?拉取请求也是如此。当我调用repository.refresh(conditional=True) 时,它似乎忽略了回购中的新提交。
如果我将etag 传递给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 来拉取更新的拉取请求数据。
【问题讨论】:
标签: python github github3.py