D1 では、データベースのクエリ時に返る例外を捕捉し、エラーを記録できます。D1 のデバッグには、Workers のデバッグ と同じツールを使います。
D1 の stmt. および db. メソッドは、エラー発生時に Error オブジェクト ↗ をスローします。例外を捕捉するには、e.message の値を記録します。
たとえば、次のコードは無効なキーワードを含むクエリです。INSERT ではなく INSERTZ になっています。
try {
// This is an intentional misspelling
await db.exec("INSERTZ INTO my_table (name, employees) VALUES ()");
} catch (e: any) {
console.error({
message: e.message
});
}上記のコードは、次のエラーメッセージをスローします。
{
"message": "D1_EXEC_ERROR: Error in line 1: INSERTZ INTO my_table (name, employees) VALUES (): sql error: near \"INSERTZ\": syntax error in INSERTZ INTO my_table (name, employees) VALUES () at offset 0"
}D1 は、詳細なエラーメッセージに加えて、次のエラー定数を返します。
| エラーメッセージ | 説明 | 推奨対応 |
|---|---|---|
D1_ERROR |
特定の D1 エラーの接頭辞です。 | 該当するエラーの詳細は、後述の「D1_ERROR の一覧」を参照してください。 |
D1_EXEC_ERROR |
行 x の Exec エラー: y エラーです。 | |
D1_TYPE_ERROR |
列と値の型が一致しないときに返ります。よくある原因は、未対応の undefined 変数を渡しており、null ではないことです。 |
値の型と列の型が一致するようにします。 |
D1_COLUMN_NOTFOUND |
列が見つかりません。 | データベースに存在する列を選択していることを確認します。 |
次の表は、D1_ERROR の具体例です。
D1_ERROR の一覧
D1_ERROR の種類 |
説明 | 推奨対応 |
|---|---|---|
No SQL statements detected. |
入力クエリに SQL 文が含まれていません。 | アプリ側: クエリに有効な SQL 文が少なくとも 1 つ含まれるようにします。 |
Your account has exceeded D1's maximum account storage limit, please contact Cloudflare to raise your limit |
アカウント内の全 D1 データベースの合計ストレージが アカウントのストレージ上限 を超えています。 | アプリ側: 使っていないデータベースを削除するか、有料プランへアップグレードします。 |
Exceeded maximum DB size. |
D1 データベースが ストレージ上限 を超えています。 | アプリ側: データベースからデータ行を削除するか、データを複数のデータベースにシャーディングします。 |
Your account has exceeded D1's free tier daily row read limit. Upgrade to a paid plan or wait until tomorrow (midnight UTC) to continue. See https://developers.cloudflare.com/d1/platform/limits/ for more details. |
アカウントが D1 Free プランの 1 日あたり行読み取り上限に達しています。 | アプリ側: UTC の午前 0 時に上限がリセットされるまで待つか、有料プランへアップグレードします。制限 を参照してください。 |
Your account has exceeded D1's free tier daily row write limit. Upgrade to a paid plan or wait until tomorrow (midnight UTC) to continue. See https://developers.cloudflare.com/d1/platform/limits/ for more details. |
アカウントが D1 Free プランの 1 日あたり行書き込み上限に達しています。 | アプリ側: UTC の午前 0 時に上限がリセットされるまで待つか、有料プランへアップグレードします。制限 を参照してください。 |
D1 DB reset because its code was updated. |
Cloudflare が D1(または基盤の Durable Object)のコードを更新し、D1 データベースを含む Durable Object が再起動しています。 | 操作を再試行します。 |
Internal error while starting up D1 DB storage caused object to be reset. |
D1 データベースを含む Durable Object の起動に失敗しています。 | 操作を再試行します。 |
Network connection lost. |
ネットワークエラーです。 | 操作を再試行します。前述の「操作の再試行」の注記を参照してください。 |
Replica disconnected from primary. |
読み取りレプリカとプライマリインスタンスの間のネットワークエラーです。 | 操作を再試行します。前述の「操作の再試行」の注記を参照してください。 |
Internal error in D1 DB storage caused object to be reset. |
エラーにより D1 データベースが再起動しました。 | 操作を再試行します。 |
Cannot resolve D1 DB due to transient issue on remote node. |
D1 データベースを含む Durable Object にクエリが到達できません。 | 操作を再試行します。前述の「操作の再試行」の注記を参照してください。 |
Can't read from request stream because client disconnected. |
クエリリクエスト(SQL クエリのアップロードなど)は行われましたが、クエリの実行が完了する前に接続が閉じられました。 | アプリ側: 操作を再試行し、接続が開いたままになるようにします。 |
D1 DB storage operation exceeded timeout which caused object to be reset. |
クエリが大量の情報(GB 単位など)を書き込もうとしており、時間がかかりすぎています。 | アプリ側: クエリを最適化する(各クエリの所要時間を短くする)、負荷を時間分散してリクエスト数を減らす、またはクエリをシャーディングします。 |
D1 DB is overloaded. Requests queued for too long. |
D1 データベースへのリクエストのキュー滞留が長すぎます。リクエストが多すぎるか、キュー内のリクエストの処理に時間がかかりすぎています。 | アプリ側: クエリを最適化する(各クエリの所要時間を短くする)、負荷を時間分散してリクエスト数を減らす、またはクエリをシャーディングします。 |
D1 DB is overloaded. Too many requests queued. |
D1 データベースへのリクエストキューが長すぎます。リクエストが多すぎるか、キュー内のリクエストの処理に時間がかかりすぎています。 | アプリ側: クエリを最適化する(各クエリの所要時間を短くする)、負荷を時間分散してリクエスト数を減らす、またはクエリをシャーディングします。 |
D1 DB's isolate exceeded its memory limit and was reset. |
クエリがメモリに載せすぎて、D1 データベースがクラッシュしました。 | アプリ側: クエリを最適化する(各クエリの所要時間を短くする)、負荷を時間分散してリクエスト数を減らす、またはクエリをシャーディングします。 |
D1 DB exceeded its CPU time limit and was reset. |
クエリが大量の CPU 時間を使っています(9 GB 超のテーブルのスキャンや、大規模なインポート / エクスポートなど)。 | アプリ側: クエリを小さなシャードに分割します。 |
D1 は読み取り専用クエリを検出し、再試行可能なエラーで失敗した場合、それらのクエリの実行を最大 2 回まで自動的に再試行します。
D1 は、再試行がデータベースへの書き込みを起こさないことを保証します。読み取り専用の検出をすり抜けて変更を伴うクエリがあっても、自動再試行は副作用から安全です。D1 は各クエリ実行後に変更の有無を確認し、再試行によって書き込みが起きていた場合はクエリをロールバックします。
Worker のライブログのストリームは、wrangler tail または Cloudflare ダッシュボード で確認できます。
- バグの報告や機能のリクエストは、Cloudflare Community Forums ↗ へ進みます。
- フィードバックは D1 の Discord チャンネル ↗ へ進みます。
- Wrangler で問題がある場合は、Wrangler の GitHub リポジトリ ↗ で報告します。
バグ報告には、次のうちできるだけ多くを含めてください。
- データベースの ID。データベース名と ID の対応は
wrangler d1 listで確認します。 - 問題が起きたときに実行したクエリ。個人を特定できる情報(PII)は必ず伏せます。
- クエリを行う Worker のコード。Workers Binding API を使った
bind()の呼び出しも含みます。 error.cause.messageの内容を含む、エラーテキスト全文。
- Workers のデバッグ方法 を学ぶ。
- Worker と D1 が生成する ログへのアクセス方法 を理解する。
wrangler devで Worker と D1 をローカル実行し、デプロイ前に問題をデバッグ する。