我正在编写一个ETL作业,其中保存了来自数据仓库中的GitHub
repo的提交、请求和文件的更新列表。我目前正在存储并将etags
传递给各种迭代器,但我不知道如何正确地执行它。在
我也很难理解object.refresh(conditional=True)
到底在做什么。如果我迭代一个repo上的所有提交,然后对每个提交调用commit.refresh(conditional=True)
,那么我会收到304异常来处理吗,这样我就知道不应该将该提交包括在数据仓库中,因为它没有更改吗?拉取请求也是如此。当我调用repository.refresh(conditional=True)
时,它似乎忽略了repo中的新提交。在
如果我将一个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
,在迭代后存储{
我的首要目标是提取自上次请求以来发生更改的任何新提交/请求。我假设此时我想从数据库中删除现有条目并用新条目更新。在
使用github3.py
API实现这一点的正确且最有效的方法是什么?在
编辑:
我再次检查了文档,有一个since
参数可以解决提交问题。所以我只需要知道如何正确地使用etag来获取更新的pull请求数据。在
因此etag的工作方式如下:
您发出请求并使用资源并存储etag
您使用ETag值发出请求
如果资源发生更改,则必须再次使用整个资源
如果没有变化,您将收到
204 No Content
响应ETag不允许您从原来的位置恢复,也没有好的方法可以从停止使用API的地方恢复。在
老实说,我认为你可能想做的是:
push
事件的webhook相关问题 更多 >
编程相关推荐