При добавлении плагина nestedDocsPlugin @payloadcms/plugin-nested-docs в конфигурацию Payload CMS версии 3.x разработчики часто сталкиваются с ошибкой выполнения SQL-запроса. Система пытается создать новый индекс _pages_v_parent_idx в таблице черновиков _pages_v, но операция завершается неудачей.
Эта проблема проявляется при генерации статических параметров в Next.js или при обычном запуске сервера разработки. Ошибка блокирует дальнейшую работу приложения и требует прямого вмешательства в структуру локальных файлов проекта.
Техническая причина сбоя
Корень проблемы заключается в архитектурных ограничениях базы данных SQLite при изменении схемы существующих таблиц. Когда плагин добавляет новое поле parent в коллекцию с включенными версиями (drafts), Payload CMS инициирует команду ALTER TABLE или CREATE INDEX.
В отличие от PostgreSQL или MySQL, SQLite не поддерживает полноценное изменение структуры таблиц на лету без создания временных копий. Если таблица уже содержит данные или была создана без этого поля, движок базы данных отклоняет запрос на модификацию.
Понимание различий в работе движков баз данных помогает выбрать правильную стратегию разработки и отладки. Ниже приведено сравнение реакции популярных СУБД на добавление новых индексов в существующие таблицы с данными.
| Характеристика | SQLite | PostgreSQL / MySQL |
|---|---|---|
| Изменение схемы на лету | Ограничено, часто требует пересоздания таблицы | Поддерживается нативно и безопасно |
Обработка CREATE INDEX на существующих данных |
Может вызвать блокировку или ошибку при конфликте схем | Выполняется атомарно в фоновом режиме |
| Рекомендация для локальной разработки | Полное пересоздание файла базы при серьезных изменениях | Использование стандартных систем миграций |
Пошаговый алгоритм решения
Наиболее эффективным и надежным способом устранения данной ошибки в локальной среде является полный сброс состояния базы данных и кэша фреймворка. Этот подход гарантирует, что Payload CMS сгенерирует схему таблиц с нуля, учитывая все новые поля и индексы подключенных плагинов.
Процесс занимает несколько минут и не требует написания сложных скриптов для ручной миграции данных. Перед выполнением действий убедитесь, что ценные локальные данные сохранены в резервной копии, если это необходимо.
А также, всего скорее вы использует шаблон WebSite, по этому в файле Pages.ts вы используете FormBlock.
Если вы откроете файл src/blocks/Form/config.ts (откуда импортируется этот блок), вы увидите внутри него поле связи:
{
name: 'form',
type: 'relationship',
relationTo: 'forms', // <--- ВОТ ОНА, ПРИЧИНА ОШИБКИ
}
Когда мы добавляем в payload.config.ts plugins: [nestedDocsPlugin(...)] (без ...plugins), мы отключаем formBuilderPlugin. Из-за этого коллекция forms не создается в Payload CMS.
Payload читает Pages.ts, видит FormBlock, заглядывает внутрь, видит запрос к коллекции 'forms', проверяет список своих коллекций, не находит там 'forms' и выдает ошибку InvalidFieldRelationship.
Решение довольно просто, когда мы возвращаем ...plugins, formBuilderPlugin создает коллекцию forms, и связь становится валидной.
Вот как это выглядит в коде:
import { plugins } from './plugins' // Ваш импорт
// ... внутри buildConfig:
plugins: [
...plugins, // <--- ДОБАВЬТЕ ЭТО, чтобы formBuilderPlugin загрузился
nestedDocsPlugin({
collections: ['pages'],
generateLabel: (_, doc) => String(doc.title),
generateURL: (docs) =>
docs.reduce((url, doc) => `${url}/${String(doc.slug)}`, ''),
}),
],
- Остановка сервера разработки: Завершите текущий процесс Node.js, нажав комбинацию клавиш
Ctrl + C(илиCmd + Cна macOS) в терминале. - Удаление файла базы данных: Найдите в корневой директории проекта файл с расширением
.db(например,payload.dbилиdev.db, как указано в вашей переменной окруженияDATABASE_URL) и удалите его. - Очистка кэша Next.js: Выполните команду удаления папки
.next, чтобы сбросить скомпилированные файлы и устаревшие типы TypeScript. В терминале это делается командойrm -rf .next(или через проводник в Windows). - Перезапуск приложения: Запустите сервер разработки заново командой
npm run dev, позволив Payload CMS инициализировать новую, корректную структуру базы данных без конфликтов.

