なんじゃくにっき

プログラミングの話題中心。

Cloudflare D1 大量データ作成/更新はどうすれば良いか?

Cloudflare D1で大量データ作成/更新系を行う方法をいくつか考えてみました。

CLIから実行

1つ目はSQLを生成してCLIから実行する方法。 (結局CLIの実装はAPIを叩いていますが)

npx wrangler d1 execute hogehoge_database --file=./bulk_insert.sql

みたいにして.sqlファイルに書いたSQLを実行する方法ですね。

利点:

  • D1のセットアップが済んでいればファイルにSQL書けば良いだけなので楽ですね。

欠点:

  • 条件によってクエリを変える操作に向かない点。
  • SQLで頑張って条件分岐するようなクエリを書くか、シェルスクリプトの標準出力を読み取って分岐させるコードを書くか、 で出来なくはないですが面倒です。

初期データの投入みたいな条件分岐など必要のない決まったデータを投入するケースはこれで良さそうです。

Workers使う方法

次はWorkerのエンドポイントを用意しておいて、認証をかけてそこから実行する方法。

利点:

  • サービスのWorkerとロジックをある程度共用出来る点。
  • DrizzleなどのORMを利用できる点。
  • UIほしければPages/Workersで作ってしまえる。

欠点

  • Workersの実行時間制限があること。大量実行だとタイムアウトしてしまいそう。
  • 言語はJavaScript/TypeScrypt固定。

APIを使う方法

https://developers.cloudflare.com/api/operations/cloudflare-d1-query-database

最後にD1のqueryエンドポイントにSQLを投げる方法。

利点

欠点

  • SQLを書かないといけない(複雑な場合はクエリビルダを何か使えば良いと思うが)

クエリ分割しよう

いずれのやり方にしても一度に大量にデータを作成しようとすると、クエリがタイムアウトする可能性があるので、

適当な件数毎に区切って分割して作成/更新すると良いと思います。

SQLファイルを分割したり、API叩くプログラムで一定件数毎に処理したり。