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公式の実装からでも、同様のことはできるはず。