Magento 2: Ошибка неопределенного индекса при обновлении M 2.2.5> M 2.3.1
При запуске программы установки bin/Magento: команда обновления я столкнулся с этой ошибкой.
Создание/обновление схемы: Примечание: Неопределенный индекс: core_store в /data/websites/website_url/public_html/vendor/magento/framework/Setup/Declaration/Schema/Db/SchemaBuilder.php на линии 152
Для обновления Magento я следую приведенным ниже инструкциям по ссылке, но теперь сталкиваюсь с этим проблема. https://digitalstartup.co.uk/t/how-to-upgrade-from-magento-2-2-8-to-2-3-1/528
Любая помощь будет признательна.
5 answers
Проблема в том, что SchemaBuilder.php
пытается найти таблицу, которая не существует в текущей базе данных . Вероятно, у вас есть старая ссылка на таблицу внешних ключей (возможно, начиная с 1.9), вызывающая этот сбой.
Вы должны выполнить эти 2 запроса (например, таблицы и ключи могут быть разными):
ALTER TABLE `wordpress_association` DROP FOREIGN KEY `FK_STORE_ID_WP_ASSOC`;
ALTER TABLE `wordpress_association` ADD CONSTRAINT `FK_STORE_ID_WP_ASSOC` FOREIGN KEY (`store_id`) REFERENCES `store` (`store_id`) ON DELETE CASCADE ON UPDATE CASCADE;
РЕДАКТИРОВАТЬ
Эта проблема может быть вызвана также из других таблиц (не только wordpress_association). Основной причиной является неправильная ССЫЛКА во ВНЕШНЕМ КЛЮЧЕ на один из ваших столиков. Обычно это происходит после миграции с Magento 1.x на Magento 2.x.
Чтобы решить эту проблему, я добавил условие "если", чтобы игнорировать код, если появится этот индекс [core_store].
// replace
if($tables[$referenceTableName] != 'core_store' ){
if (isset($tables[$referenceTableName]) && $referenceTableName !== $tableName) {
$this->processReferenceKeys([$referenceTableName =>
$tables[$referenceTableName]], $schema);
unset($tables[$referenceTableName]);
}
}
Я решил эту проблему, выполнив следующие действия
- Экспортировал дамп SQL для базы данных
- Искал core_store из-за ошибки
Undefined index: core_store
- Удалил все внешние ключи, ссылающиеся на эту таблицу
- Полностью отбросил эту таблицу, так как она больше не была нужна.
Это решило мою проблему.
Но не забудьте сохранить резервную копию базы данных, прежде чем делать это.
У меня та же проблема. Я не люблю изменять основной код. Поэтому я просто открыл этот файл:
vendor/magento/framework/Setup/Declaration/Schema/Db/SchemaBuilder.php
И добавьте несколько отладочных сообщений, чтобы узнать, в чем проблема. Скрипт останавливается на зависимостях FK для плоских таблиц.
Поэтому моим решением было удалить их. После этого bin/magento setup:upgrade
запускается без ошибки!
У меня была та же ошибка после добавления префикса (через phpmyadmin) в таблицу sequence_product
и копирования таблицы из другой базы данных magento в мою базу данных.
Проблема: Таблица с префиксами все еще использовалась вместо скопированной, поэтому мне пришлось выяснить, в какой таблице все еще используется таблица с префиксами вместо скопированной.
Мне пришлось отлаживать файл vendor/magento/framework/Setup/Declaration/Schema/Db/SchemaBuilder.php чтобы добавить некоторую отладку вывод:
private function processReferenceKeys(array $tables, Schema $schema)
{
$writer = new \Zend\Log\Writer\Stream(BP . '/var/log/zend_debug.log');
$logger = new \Zend\Log\Logger();
$logger->addWriter($writer);
foreach ($tables as $table) {
$logger->info("Table: " . $table->getName());
$tableName = $table->getName();
if ($schema->getTableByName($tableName) instanceof Table) {
continue;
}
$referencesData = $this->dbSchemaReader->readReferences($tableName, $table->getResource());
$references = [];
foreach ($referencesData as $referenceData) {
//Prepare reference data
$referenceData['table'] = $table;
$referenceTableName = $referenceData['referenceTable'];
$logger->info("Ref-Table: " . $referenceTableName);
$referenceData['column'] = $table->getColumnByName($referenceData['column']);
$referenceData['referenceTable'] = $this->tables[$referenceTableName];
$referenceData['referenceColumn'] = $referenceData['referenceTable']->getColumnByName(
$referenceData['referenceColumn']
);
$references[$referenceData['name']] = $this->elementFactory->create('foreign', $referenceData);
//We need to instantiate tables in order of references tree
if (isset($tables[$referenceTableName]) && $referenceTableName !== $tableName) {
$this->processReferenceKeys([$referenceTableName => $tables[$referenceTableName]], $schema);
unset($tables[$referenceTableName]);
}
}
$table->addConstraints($references);
$schema->addTable($table);
}
}
Теперь запустите bin setup:upgrade
еще раз и просмотрите файл журнала /var/log/zend_debug.log.
Посмотрите на последние записи, вы увидите таблицу и таблицу ссылок. В моем случае это был стол email_catalog
.
Теперь откройте таблицу в phpmyadmin, перейдите на вкладку структура, затем на представление отношений и выберите правильную таблицу
Чему вы должны научиться из этого:
Никогда не добавляйте префикс таблицы к сделай резервную копию! Вместо этого создайте новую базу данных и скопируйте в нее таблицы, которые вы пытаетесь создать резервную копию.