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.jsonc の database_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 でどのアカウントでログインしているか確認する習慣をつけると、アカウント違いによるエラーを事前に防げます。