Magento: перестроение индекса после исключения самописного импорта / обновления продукта - PullRequest
2 голосов
/ 10 мая 2011

у нас есть модуль для импорта товаров в magento. Модуль был написан программистом Magento. Он использует Magento API и написан на PHP. Он читает CSV-подобный файл (фактический используемый разделитель - «#»), переводит строку в продукт, а затем записывает продукт обратно в Magento. Пока все хорошо.

Я продублировал и несколько раз менял модуль. Последним изменением было обновление продуктов, а не импорт целых продуктов. Модуль работал около 950 из этих продуктов, затем выдал исключение:

magento:/srv/www/vhosts/www.mysite.com/shell # php import_colors.php ../var/import/colors.csv.out.csv
PHP Fatal error:  Uncaught exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '12804-176-1-563' for key 'PRIMARY'' in /srv/www/vhosts/www.mysite.com/lib/Zend/Db/Statement/Pdo.php:234
Stack trace:
#0 /srv/www/vhosts/www.mysite.com/lib/Zend/Db/Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array)
#1 /srv/www/vhosts/www.mysite.com/lib/Zend/Db/Adapter/Abstract.php(468): Zend_Db_Statement->execute(Array)
#2 /srv/www/vhosts/www.mysite.com/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('INSERT INTO `ca...', Array)
#3 /srv/www/vhosts/www.mysite.com/lib/Varien/Db/Adapter/Pdo/Mysql.php(333): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO `ca...', Array)
#4 /srv/www/vhosts/www.mysite.com/lib/Varien/Db/Adapter/Pdo/Mysql.php(1537): Varien_Db_Adapter_Pdo_Mysql->query('INSERT INTO `ca...', Array)
#5 /srv/www/vhosts/www.mysite.com/app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Indexer/Eav in /srv/www/vhosts/www.mysite.com/lib/Zend/Db/Statement/Pdo.php on line 234

Fatal error: Uncaught exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '12804-176-1-563' for key 'PRIMARY'' in /srv/www/vhosts/www.mysite.com/lib/Zend/Db/Statement/Pdo.php:234

Stack trace:
#0 /srv/www/vhosts/www.mysite.com/lib/Zend/Db/Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array)
#1 /srv/www/vhosts/www.mysite.com/lib/Zend/Db/Adapter/Abstract.php(468): Zend_Db_Statement->execute(Array)
#2 /srv/www/vhosts/www.mysite.com/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('INSERT INTO `ca...', Array)
#3 /srv/www/vhosts/www.mysite.com/lib/Varien/Db/Adapter/Pdo/Mysql.php(333): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO `ca...', Array)
#4 /srv/www/vhosts/www.mysite.com/lib/Varien/Db/Adapter/Pdo/Mysql.php(1537): Varien_Db_Adapter_Pdo_Mysql->query('INSERT INTO `ca...', Array)
#5 /srv/www/vhosts/www.mysite.com/app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Indexer/Eav in /srv/www/vhosts/www.mysite.com/lib/Zend/Db/Statement/Pdo.php on line 234

Я ничего не думал об этом. Клиент с радостью менял последние 50 или около того продуктов самостоятельно, и сообщение об ошибке было забыто.

Однако сегодня заказчик назвал, что его индекс атрибута продукта не будет создан, индекс в бэк-офисе остался на оранжевом «Обработка». Итак, я исследовал и обнаружил, что индекс можно построить с помощью shell / indexer.php. Итак, я попробовал и, о чудо, точно такое же сообщение об ошибке, которое я почти забыл.

Я сбросил базу данных и попытался выяснить, какая таблица действительно содержит данные, перечисленные в сообщении об ошибке (12804-176-1-563), но мне не повезло. Похоже, что эти 4 даты нигде нельзя найти в этом порядке.

Теперь есть два варианта действий. Можно было бы выяснить, какая таблица содержит проблему, чтобы ее можно было исправить с помощью самого Magento. Другой способ может состоять в том, чтобы очистить соответствующую таблицу индексов и перестроить индекс с нуля. Я не уверен, что копаться в схеме базы данных, я не совсем понимаю, это хорошая идея.

Может кто-нибудь помочь мне определить проблему?

Ответы [ 2 ]

2 голосов
/ 18 июня 2011

У меня та же проблема с самописным скриптом импорта PHP.Я все еще не уверен, как это исправить, но я обнаружил, что в 12804-176-1-563 12804 ссылается на идентификатор продукта в БД.Поэтому, если вы удалите / воссоздаете или отключите этот продукт, индексатор будет работать нормально.Если у вас есть какие-либо советы о причинах нарушения целостности, пожалуйста, поделитесь!: -)

2 голосов
/ 11 мая 2011

Пожалуйста, убедитесь, что это не что-то простое, например, некоторые дубликаты продуктов в базе данных, которые были «прерваны», чтобы оставить запись продукта без значения SKU.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...