2017-04-04 113 views
0

我正在写一个ETL作业,我在我们的数据仓库中保存了来自我们GitHub回购的更新提交列表,提交请求和文件。我目前正在存储并将etags传递给各种迭代器,但我不认为我正在理解如何正确执行它。如何仅使用github3.py来修改提交/提交请求?

我也很难理解object.refresh(conditional=True)究竟在做什么。如果我遍历所有提交的提交,然后每个提交commit.refresh(conditional=True),我会收到一个304异常处理,所以我知道不会在数据仓库中包含该提交,因为它没有更改?拉取请求也一样。当我打电话给repository.refresh(conditional=True)时,它似乎忽略了回购中的新提交。

如果我将etag传递给repo.iter_commits,它只会返回修改的提交,还是会返回所有对回购的提交(如果根本没有任何更改)?

这是我目前使用的基本流程:

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来提取更新的请求数据。

回答

1

这样的ETag以下列方式工作:

  1. 你做的请求,并消耗资源和存储的eTag

  2. 你让与ETag值

    • 的请求

      如果资源发生更改,则必须再次使用整个资源

    • 如果没有变化,您将收到204 No Content响应

的ETag不允许你从你在哪里,并有从你离开了与API,其中恢复没有什么好办法恢复。

老实说,我认为你可能想要做的是以下几点:

  1. 消费上的存储库
  2. 所有在场的提交注册订阅了刚刚push事件
  3. 过程中的其余网络挂接当人们将他们推送到GitHub时,这些提交就会出现。