💡

tdGoというTreasure DataのSDKを作った

2023/04/04に公開

今あるtd-client-goが長年メンテされてないので、一から新しいSDKを作りました。
https://github.com/mickeey2525/tdGo

なんで作ったか

既存のtd-client-goだと以下の問題があった

  1. Contextが使えない
  2. 全てMapに一度変換されている
  3. 長いことメンテナンスされておらず、新規追加されたAPIに対応するものがない

また最終的にはワンバイナリで利用可能なCLI Toolを作りたいという思惑もあり、Goを採用しました。

使い方

clientの生成方法

import "github.com/mickeey2525/tdGo"

client, err := tdGo.NewClient("your-api-key", "https://api.treasuredata.com")
if err != nil {
	log.Fatalf("Failed to create tdGo client: %s", err)
}

URLの指定をtd-client-goに比べて簡単にしました。
ちなみにtd-client-goは以下のように書く必要があります。

type Endpoint struct {
	endpoint string
}

func (e Endpoint) Route(s string) string {
	return e.endpoint
}

func main() {
	endpoint := route{region: "api.treasuredata.co.jp"}
	client, err := td_client.NewTDClient(td_client.Settings {
		ApiKey: "Your API Key",
		Router: endpoint,
	})
	if err != nil {
		log.Fatalf("Something went wrong when you create TD Clinet instance: %s", err)
	}
	var jobOptions = td_client.ListJobsOptions{}
	jobOptions.WithStatus("queued")
	jl, err := client.ListJobsWithOptions(&jobOptions)
	fmt.Println(jl)
	if err != nil {
		log.Fatalf("Something went wrong during get queued jobs: %s",err)
	}
	list := jl.Count
	fmt.Println(list)
}

httpclientのOptionの設定方法

また今回は楽をするためにhttpclientにrestyを採用しているのですが、WithHttpClientで設定ができるようにしてあります。

resClient := resty.New()
	resClient.SetTimeout(1 * time.Minute)
	apikey := os.Getenv("TD_API_KEY")
	client, err := tdGo.NewClient(apikey, "https://api.treasuredata.com", tdGo.WithHttpClient(resClient))
	if err != nil {
		log.Fatalln(err)
	}

対応しているREST API

なるべくここに記載のREST APIに対応するようにしています。

https://api-docs.treasuredata.com/pages/td-api/overview/

今後について

気力が尽きてテストを書いていないものもあるのでテストを書こうと思っています。
またコードないコメントも足りないため適宜書いていく予定です。

将来的にはWorkflow APIやCDP APIについても対応する予定です。

Discussion