You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Bug] Migration failed: Table ms3_grid_fields does not exist #270
При установке MiniShop3 возникает ошибка выполнения миграции. Миграция 20251127000002_seed_customers_grid_config.php пытается вставить данные в таблицу ms3_grid_fields, но таблица ещё не создана.
Стектрейс ошибки:
[MiniShop3] Migration execution failed: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'cc54143_pmk3.ms3_grid_fields' doesn't exist
Шаги воспроизведения
Установить MODX 3.x
Попытаться установить MiniShop3 через пакетный менеджер
Процесс установки прерывается на выполнении миграций
Окружение
MiniShop3: 1.10.1-beta1
MODX: 3.x
PHP: 8.x
Дополнительный контекст
Проблема встречается при частичной или повторной установке.
PR #271 закрывает каскадное падение seed-миграций — теперь при отсутствии ms3_grid_fields миграции выходят no-op с явным сообщением в output вместо SQLSTATE 42S02. Это обход симптома, но не root cause.
Root cause всё ещё открыт: на сервере пользователя msGridField не создаётся в 20251020000000_initial_schema. Без этой таблицы grid configs Vue-админки фактически не будут работать (пустые гриды) — defensive checks дают чистое логирование, но функционал теряется.
Гипотезы (без воспроизведения сказать точно нельзя)
Конфликт двух TIMESTAMP DEFAULT CURRENT_TIMESTAMP в одной таблице. В схеме msGridField есть created_at (DEFAULT CURRENT_TIMESTAMP) + updated_at (ON UPDATE CURRENT_TIMESTAMP). До MySQL 5.6.5 такая комбинация запрещена. MySQL 5.7 это поддерживает, но при explicit_defaults_for_timestamp = OFF (старый дефолт) поведение незакономерно.
Скрытый фейл xPDO Manager::createObjectContainer().initial_schema в случае фейла создания таблицы пишет Failed to create table в output и идёт дальше — без throw. Если хостинг подавляет вывод миграций, ошибка незаметна, а seed-миграции потом падают на отсутствующей таблице. Стоит дополнить initial_schema, чтобы он throw при провале — Phinx тогда остановится и покажет точную миграцию-виновника.
'phptype' => 'json' колонки config на MySQL 5.7 транслируется xPDO в TEXT, должно работать. Маловероятно.
MySQL версия из багрепорта — 5.7, но возможно у Timeweb это древняя точечная версия с особенностями strict_mode/sql_mode. В частности NO_ZERO_DATE, NO_ZERO_IN_DATE могут конфликтовать с TIMESTAMP NOT NULL без явного DEFAULT.
План воспроизведения
Поднять MySQL 5.7 локально (Docker: docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=test mysql:5.7).
Создать чистый MODX 3.x на этой БД.
Запустить установку MS3 → посмотреть полный output initial_schema (через CLI Phinx, не через пакетный менеджер, чтобы output не глотался).
Если msGridField зафейлил — собрать SQL, который пытается выполнить xPDO Manager (через ms3_log_level = debug или прямой dump), и попробовать выполнить руками. Тогда станет видна точная DB-ошибка.
Что точно НЕ root cause
Скриншот phpMyAdmin от пользователя с предупреждением «key, precision, null, default являются зарезервированными словами MySQL» — это диагностический warning phpMyAdmin при ручном CREATE TABLE через UI-форму. Эти слова встречаются в xPDO fieldMeta как атрибуты колонок (null, precision, default), а не как имена. При нажатии OK таблица создаётся. К ошибке initial_schema не относится.
Метка «needs reproduction» — без MySQL 5.7 локально root cause не найти.
Хорошая идея — улучшить initial_schema, чтобы он throw при фейле создания таблицы. Тогда в следующем релизе пользователи будут видеть точную причину, а не «Table doesn't exist» на 12-й миграции.
Activity
biz87 commentedon May 18, 2026
PR #271 закрывает каскадное падение seed-миграций — теперь при отсутствии
ms3_grid_fieldsмиграции выходят no-op с явным сообщением в output вместоSQLSTATE 42S02. Это обход симптома, но не root cause.Root cause всё ещё открыт: на сервере пользователя
msGridFieldне создаётся в20251020000000_initial_schema. Без этой таблицы grid configs Vue-админки фактически не будут работать (пустые гриды) — defensive checks дают чистое логирование, но функционал теряется.Гипотезы (без воспроизведения сказать точно нельзя)
Конфликт двух
TIMESTAMP DEFAULT CURRENT_TIMESTAMPв одной таблице. В схемеmsGridFieldестьcreated_at(DEFAULT CURRENT_TIMESTAMP) +updated_at(ON UPDATE CURRENT_TIMESTAMP). До MySQL 5.6.5 такая комбинация запрещена. MySQL 5.7 это поддерживает, но приexplicit_defaults_for_timestamp = OFF(старый дефолт) поведение незакономерно.Скрытый фейл
xPDO Manager::createObjectContainer().initial_schemaв случае фейла создания таблицы пишетFailed to create tableв output и идёт дальше — безthrow. Если хостинг подавляет вывод миграций, ошибка незаметна, а seed-миграции потом падают на отсутствующей таблице. Стоит дополнитьinitial_schema, чтобы онthrowпри провале — Phinx тогда остановится и покажет точную миграцию-виновника.'phptype' => 'json'колонкиconfigна MySQL 5.7 транслируется xPDO вTEXT, должно работать. Маловероятно.MySQL версия из багрепорта — 5.7, но возможно у Timeweb это древняя точечная версия с особенностями strict_mode/sql_mode. В частности
NO_ZERO_DATE,NO_ZERO_IN_DATEмогут конфликтовать сTIMESTAMP NOT NULLбез явногоDEFAULT.План воспроизведения
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=test mysql:5.7).initial_schema(через CLI Phinx, не через пакетный менеджер, чтобы output не глотался).msGridFieldзафейлил — собрать SQL, который пытается выполнить xPDO Manager (черезms3_log_level = debugили прямой dump), и попробовать выполнить руками. Тогда станет видна точная DB-ошибка.Что точно НЕ root cause
Скриншот phpMyAdmin от пользователя с предупреждением «
key, precision, null, defaultявляются зарезервированными словами MySQL» — это диагностический warning phpMyAdmin при ручном CREATE TABLE через UI-форму. Эти слова встречаются вxPDO fieldMetaкак атрибуты колонок (null,precision,default), а не как имена. При нажатии OK таблица создаётся. К ошибкеinitial_schemaне относится.Что предлагаю
initial_schema, чтобы онthrowпри фейле создания таблицы. Тогда в следующем релизе пользователи будут видеть точную причину, а не «Table doesn't exist» на 12-й миграции.fix(migrations): defensive checks for ms3_grid_fields table
fix(migrations): resolve ms3_grid_fields missing on install (#270)
fix(migrations): resolve ms3_grid_fields missing on install (#270) (#294
release: 1.12.0-beta1