INTEGRITY Документация

Отладка D1

D1 позволяет перехватывать исключения и записывать в журнал ошибки, возникающие при запросах к базе данных. Для отладки D1 используются те же инструменты, что и при отладка Workers.

D1 stmt. и db. методы выбрасывают Объект ошибки при каждой ошибке. Чтобы перехватывать исключения, записывайте в журнал e.message значение.

Например, в коде ниже запрос содержит недопустимое ключевое слово: INSERTZ вместо INSERT:

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: ошибка y.
D1_TYPE_ERROR Возникает при несоответствии типа столбца и значения. Часто это происходит из-за передачи undefined переменную (не поддерживается) вместо null. Убедитесь, что тип значения соответствует типу столбца.
D1_COLUMN_NOTFOUND Столбец не найден. Убедитесь, что выбрали столбец, который существует в базе данных.

В следующей таблице перечислены конкретные примеры D1_ERROR.

Список ошибок D1_ERROR

D1_ERROR тип Описание Рекомендуемое действие
No SQL statements detected. Входной запрос не содержит SQL-операторов. Действие приложения: убедитесь, что запрос содержит хотя бы один допустимый SQL-оператор.
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. Действие приложения: дождитесь полуночи по UTC, когда лимит будет сброшен, или перейдите на платный план. См. Лимиты.
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. Действие приложения: дождитесь полуночи по UTC, когда лимит будет сброшен, или перейдите на платный план. См. Лимиты.
D1 DB reset because its code was updated. Cloudflare обновил код D1 (или соответствующего Durable Object), и Durable Object, содержащий базу данных D1, перезапускается. Повторите операцию.
Internal error while starting up D1 DB storage caused object to be reset. Durable Object, содержащий базу данных D1, не может запуститься. Повторите операцию.
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. Запрос не может достичь Durable Object, содержащего базу данных D1. Повторите операцию. См. примечание «Повтор операции» выше.
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. Запрос потребляет много процессорного времени (например, сканирует таблицу объёмом более 9 GB или выполняет крупный импорт/экспорт). Действие приложения: разделите запрос на более мелкие шарды.

Автоматические повторные попытки

D1 распознаёт запросы только для чтения и при ошибках, которые можно устранить повтором, автоматически пытается выполнить их заново до двух раз.

D1 гарантирует, что ни одна попытка повтора не приведёт к записи в базу данных, поэтому автоматические повторы безопасны от побочных эффектов, даже если через определение запросов только для чтения проскользнёт запрос, вносящий изменения. Для этого D1 проверяет наличие изменений после каждого выполнения запроса, и если попытка повтора всё же привела к записи, запрос откатывается.

Просмотр логов

Просматривайте поток логов вашего Worker в реальном времени с помощью wrangler tail либо через Панель управления Cloudflare.

Сообщить о проблемах

В отчете об ошибке рекомендуется указать как можно больше из следующего: