之前說過許多資料庫都已經開始收費了,所以想要找一個免費的資料庫來使用的其實相當麻煩。不論是使用 Heroku 或是 Render 的資料庫其實都是一筆不小的費用。 所以,常常動歪腦筋到一些奇怪的儲存體來當資料庫,今天這一篇文章將透過 Github Golang 的 API 來將你個人的隱私 (Private Repository) 的 issue 來當成資料庫來使用。
這些只是一些建議,以下的程式碼範例作法更加的簡單。 只是一個 Key -> Value 的方式來存放。 Key 放在 Title ,而 Value 就直接放在第一個 Comment 裏面。
type GithubDB struct {
Name string // github 擁有者名字
Repo string // repo 名稱(可以使 private)
Token string // 剛剛取得的 Access Token
Client *github.Client
}
func createGithubClient(token string) *github.Client {
ctx := context.Background()
ts := oauth2.StaticTokenSource(
&oauth2.Token{AccessToken: token},
)
tc := oauth2.NewClient(ctx, ts)
return github.NewClient(tc)
}
func (u *GithubDB) saveIssue(title, body string) error {
input := &github.IssueRequest{
Title: String(title),
Body: String(body),
Assignee: String(""),
}
_, _, err := u.Client.Issues.Create(context.Background(), u.Name, u.Repo, input)
if err != nil {
fmt.Printf("Issues.Create returned error: %v", err)
return err
}
return nil
}
func (u *GithubDB) getIssue(title string) (string, int, error) {
ret, _, err := u.Client.Search.Issues(context.Background(), title, nil)
if err != nil {
fmt.Printf("Issues.search returned error: %v", err)
return "", 0, err
}
log.Println("issue ret:", ret)
for _, v := range ret.Issues {
log.Println("return issue:", v)
log.Println("Issue Num:", v.Number)
log.Println("Body:", v.Body)
log.Println("Comments:", v.Comments)
}
return *ret.Issues[0].Body, *ret.Issues[0].Number, nil
}
func (u *GithubDB) updateIssue(number int, title string, updatedCnt string) error {
updateIssue := &github.IssueRequest{
Title: String(title),
Body: String(updatedCnt),
Assignee: String(""),
}
ret, _, err := u.Client.Issues.Edit(context.Background(), u.Name, u.Repo, number, updateIssue)
if err != nil {
fmt.Printf("Issues.edit returned error: %v", err)
return err
}
log.Println("Issue updated:", ret)
return nil
}
其實在做一些簡單的範例程式的時候,如果你資料庫本身沒有太多的欄位需求。本身的存取量也不是很大,或許可以考慮透過 Github Issue 來存放你的資料。一來你的資料庫都是「可視化」,你也可以節省一些不需要的額外開銷。