🍃このブログは移転しました。
3秒後、自動的に移動します・・・。

Cloudflare D1のデータベースファイルをダンプして使う

Cloudflare WorkersのD1といえば、APIとして立てたWorkerの内部で操作するのがまぁ一般的なはず。

ただ、D1はSQLiteなので、その裏にいるDBファイルを持ち回すこともできるんでは?っていう。

ダンプする

なんとそれ用のAPIが用意されてる!

https://developers.cloudflare.com/d1/platform/client-api/#await-dbdump

というわけで、こういうコードをWorkerで実装すればよい。

export default {
  async fetch(_req, env, _ctx) {
    const db = env.DB;

    const arrayBuffer = await db.dump();
    return new Response(arrayBuffer, {
      headers: {
        "Content-Type": "application/octet-stream",
      },
    };
  },
};

これだけで、このエンドポイントからSQLiteのバイナリが落とせるようになる。

ダッシュボードからでも

どうやらD1は1-2時間くらいの間隔で自動バックアップしてくれてる(手動実行もできる)ので、それを直接ダウンロードすることでも入手できた。

Cloudflareのダッシュボードにブラウザでログインして、該当のD1データベースの特定のバックアップをダウンロードするだけ。
GUIからリストアできるのはじめて知った)

あとは使うだけ

`sqlite3 dump.db`みたいにするなり。

SQL.jsなんかを使えば、ブラウザで使うこともできる。

import initSqlJs from "sql.js";

const SQL = await initSqlJs({
  locateFile: (file) => `https://sql.js.org/dist/${file}`
});

const res = await fetch("/my-db-dump-endpoint");
const ab = await res.arrayBuffer();

const db = new SQL.Database(new Uint8Array(ab));

あとは煮るなり焼くなり。

前回の記事で書いたSQLite公式の実装からでも、同様のことはできるはず。

SQLite公式のWASM実装を試す - console.lealog();