데이터베이스로서의 GitHub
나중 분석을 위해 내 코드에서 중요한 특정 이벤트에 대한 정보를 멋지게 저장하는 방법이 필요했습니다. VCS에 커밋하는 것보다 더 좋은 것은 무엇일까요? 타임스탬프, 커밋 설명 등
로컬 git을 먼저 사용한 다음 GitHub로 전환했습니다. GitHub는 모든 기능에 대한 API를 제공합니다.
아래의 작은 코드는 이 접근 방식이 어떻게 작동하는지 보여줍니다.
GitHub account에서 생성할 수 있는 GITHUB_TOKEN과 리포지토리 이름이 있는
repo
변수의 두 가지를 설정해야 합니다.새 파일을 만들어 파일을 만듭니다. 그런 다음 다시 업데이트하여 수정합니다. 그런 다음 파일을 삭제합니다.
리포지토리 로그는 이러한 모든 작업을 커밋 기록에 잘 보관합니다.
참고: PyGithub 패키지를 먼저 설치해야 합니다.
pip instal pygithub
암호:
import os
from typing import Optional, Union
import github
from github.Repository import Repository
def get_repo(repo: str) -> Repository:
assert repo, 'repository name is missing'
g = github.Github(os.environ['GITHUB_TOKEN'])
return g.get_repo(repo)
def upsert_file(
name: str,
body: str,
message: Optional[str] = None,
*,
repo: Optional[Union[Repository, str]] = None,
branch: Optional[str] = "main",
verbose: Optional[bool] = False,
):
r = repo if isinstance(repo, Repository) else get_repo(repo)
try:
description_ = message or f'Update {name}'
current = r.get_contents(name, ref=branch)
current = r.update_file(
current.path,
description_,
body,
current.sha,
branch=branch,
)
if verbose:
print(current)
except github.GithubException:
message = message or f'Create {name}'
created = r.create_file(name, message, body, branch=branch)
if verbose:
print(created)
def delete_file(
name: str,
message: str = None,
*,
repo: Optional[Union[Repository, str]] = None,
branch: str = "main",
verbose: Optional[bool] = False,
):
r = repo if isinstance(repo, Repository) else get_repo(repo)
message = message or f'Delete {name}'
current = r.get_contents(name, ref=branch)
deleted = r.delete_file(
current.path,
message,
current.sha,
branch=branch,
)
if verbose:
print(deleted)
assert os.getenv('GITHUB_TOKEN'), 'Set GITHUB_TOKEN variable'
repo = "<YOUR_GITHUB_NAME>/<REPO_NAME>"
upsert_file("README.md", "NEW BODY", repo=repo, verbose=True)
upsert_file("README.md", "UPDATED BODY", repo=repo, verbose=True)
delete_file("README.md", repo=repo, verbose=True)
다음과 같이 실행하십시오.
python main.py
다음과 같이 인쇄됩니다.
{'content': ContentFile(path="README.md"), 'commit': Commit(sha="a6c540fec9b1b02e21acbb0ddd790efb6b7cb33f")}
{'commit': Commit(sha="2436e7ff2692a9af398dabd9eb9d1eee0f821954"), 'content': ContentFile(path="README.md")}
{'commit': Commit(sha="31fefb51e3510071777e4f4c8a0971de0a184f78"), 'content': NotSet}
GitHub 리포지토리로 이동하여 커밋을 확인합니다.
Reference
이 문제에 관하여(데이터베이스로서의 GitHub), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/begoon/github-as-a-database-2g0m텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)