Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

D1 のデバッグ

最終更新 Markdown で表示Agent セットアップ

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 ダッシュボード で確認できます。

問題の報告

バグ報告には、次のうちできるだけ多くを含めてください。

  • データベースの ID。データベース名と ID の対応は wrangler d1 list で確認します。
  • 問題が起きたときに実行したクエリ。個人を特定できる情報(PII)は必ず伏せます。
  • クエリを行う Worker のコード。Workers Binding API を使った bind() の呼び出しも含みます。
  • error.cause.message の内容を含む、エラーテキスト全文。

関連リソース

役に立ちましたか?