☁️

CloudFlare API で D1 の出力[GO]

に公開

はじめに

Cloudflare D1 DBのデータをエクスポートする際の注意点をまとめます。
詳しくはこれを参照すること。
https://developers.cloudflare.com/api/go/resources/d1/subresources/database/methods/export

https://pkg.go.dev/github.com/cloudflare/cloudflare-go/v6@v6.10.0/d1

リファレンスのサンプルコード

ちょっとだけ弄ってあります。
ほんもののキーっぽいのは、CloudFlareのサンプルに乗ってるやつです。

package main

import (
  "context"
  "fmt"

  "github.com/cloudflare/cloudflare-go/v6"
  "github.com/cloudflare/cloudflare-go/v6/d1"
  "github.com/cloudflare/cloudflare-go/v6/option"
)

func main() {
  client := cloudflare.NewClient(
    // APIキー
    option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"),
  )
  response, err := client.D1.Database.Export(
    context.TODO(),
    // データベースID
    "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    d1.DatabaseExportParams{
      // アカウントID
      AccountID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"),
      OutputFormat: cloudflare.F(d1.DatabaseExportParamsOutputFormatPolling),
    },
  )
  if err != nil {
    panic(err.Error())
  }
  fmt.Printf("%+v\n", response.AtBookmark)
}

解説

まず、Golangを利用しているので、importから。
Cloudflare Go API Libraryと比較すると、apiライブラリのimportのurlのパスに、なぜかv6の文字がないものの、かけてると動かないので、上のコードのように加えてください。

つづいて、注釈したように、各種のIDの類を入れてください。
エクスポートしたいデータベースのページをCloudflareのダッシュボードで開くと、
https://dash.cloudflare.com/<アカウントID>/workers/d1/databases/<データベースID>/metrics
のようになっているのでこれらを指定してください。

Cloudflareのダッシュボードで左のメニューから、アカウントの管理/アカウントAPIトークンを開いて、Cloudflare D1の書き込み権限を持つトークンを制作します。(なぜ読み込みだとだめなのかは謎)
生成したトークンは一度しか表示されないため、しっかりと(他の人に見えないように)メモしてください。

さいごに、Pollingをします。
CloudFlare側にファイルが完成したか定期的に聞いて、完成したらレスポンスにファイルのURLが得られる方式なので、もう何度かリクエストを送らねばなりません。

レスポンスのAtBookmarkがブックマークになっているので、これを使用してリクエストします。このように指定して繰り返しリクエストしてください。なお、ブックマークは変動しません。

d1.DatabaseExportParams{
  AccountID: cloudflare.F(account),
  CurrentBookmark: cloudflare.F(<ブクマ>),
  OutputFormat: cloudflare.F(d1.DatabaseExportParamsOutputFormatPolling),
},

.Statuscompleteだったら.Resultと中身のSignedURLが読み込める的な感じだと思われる。

というわけで、完成形はこんなかんじなはず。

Discussion