SvelteKit + D1をCloudflare Pagesにデプロイした話

D1(CloudflareのSQLite)を導入したSvelteKitプロジェクトをCloudflare Pagesにデプロイしました。 ローカルで動作確認済みでも、デプロイ時にD1まわりでハマりやすい点があるため、手順とトラブルシューティングをまとめます。

前提

  • SvelteKit + Cloudflare Pages のデプロイ設定は完了済み(GitHub連携)
  • D1データベース(sveltekit-blog-db)の作成と wrangler.jsonc への設定は完了済み
  • ローカルでは npx wrangler dev で動作確認済み

デプロイの流れ

D1を使うプロジェクトをデプロイするとき、ローカル用と本番用でDBが分かれています。

ローカル開発        → .wrangler/state/ 配下のローカルSQLite
本番(Cloudflare)  → Cloudflare D1(リモート)

ローカルでマイグレーションを実行しても本番には反映されません。デプロイ前にリモートD1にも別途マイグレーションを実行する必要があります。

Step 1: リモートD1にマイグレーションを実行する

npx wrangler d1 execute sveltekit-blog-db --remote --file=migrations/001_posts.sql

--remote フラグで本番のCloudflare D1に対して実行します。

確認コマンドでデータが入っているか確認します。

npx wrangler d1 execute sveltekit-blog-db --remote --command="SELECT * FROM posts"

Step 2: GitHubにpushしてデプロイ

git add -A
git commit -m "D1データベースを導入して記事データをDBから取得するよう変更"
git push origin main

GitHub連携済みのCloudflare Pagesが自動でビルド・デプロイします。


トラブル:D1 binding not found エラー

デプロイ時に以下のエラーが出ることがあります。

✘ [ERROR] D1 binding 'DB' references database 'xxxxxxxx-...' which was not found.
Verify the database exists in your account and that the database_id in your
configuration is correct. [code: 10181]

原因

wrangler.jsoncdatabase_id が、Cloudflare Pagesのデプロイに使っているアカウントと別のアカウントに作成したDBのIDになっていた。

Cloudflareのアカウントを複数持っている場合、wranglerのログインアカウントとPages側のアカウントが一致していないとこのエラーが発生します。

解決手順

1. 誤ったアカウントのDBを削除

npx wrangler d1 delete sveltekit-blog-db

2. 正しいアカウントに切り替え

npx wrangler logout
npx wrangler login

ブラウザが開くので、Cloudflare Pagesと同じアカウントでログインします。

3. 正しいアカウントでDBを作成

npx wrangler d1 create sveltekit-blog-db
質問 回答
Would you like Wrangler to add it on your behalf? y
What binding name would you like to use? DB
For local dev, do you want to connect to the remote resource? n

wranglerが自動で wrangler.jsonc に追記しますが、古いエントリが残る場合があります。

4. wrangler.jsonc の重複エントリを削除

自動追記によって古いIDのエントリが残ることがあります。database_id が2つある場合は古い方を削除して1つだけにします。

{
  "d1_databases": [
    {
      "binding": "DB",
      "database_name": "sveltekit-blog-db",
      "database_id": "新しいIDだけ残す"
    }
  ]
}

5. リモートD1に再度マイグレーションを実行

npx wrangler d1 execute sveltekit-blog-db --remote --file=migrations/001_posts.sql

6. GitHubにpushして再デプロイ

git add -A
git commit -m "D1のdatabase_idを正しいアカウントのものに修正"
git push origin main

まとめ

ポイント 内容
ローカルと本番のDBは別 --local はローカルSQLite、--remote は本番Cloudflare D1
デプロイ前に --remote でマイグレーション ローカルのマイグレーションは本番に反映されない
アカウントの不一致に注意 wranglerのログインアカウントとPagesのアカウントを揃える
wrangler.jsonc の重複エントリ 自動追記後に古いエントリが残る場合は手動で削除

Cloudflareのアカウントを複数持っている場合は、npx wrangler whoami でどのアカウントでログインしているか確認する習慣をつけると、アカウント違いによるエラーを事前に防げます。

← トップページに戻る