Обновление SKU из CSV в Magento - нарушение ограничения целостности: ошибка 1062 - PullRequest
0 голосов
/ 09 января 2012

У меня есть код ниже, чтобы обновить список CSV от старого значения до нового значения. Однако это вызывает ошибку для некоторых продуктов:

Не удалось получить продукты из Magento: SQLSTATE [23000]: Нарушение ограничения целостности: 1062 Дублирующая запись '168-122-1-7' для ключа 1

    include_once '../app/Mage.php';
    Mage::app();

    $updates_file="/home/varsityk/public_html/csvs/sku2sku.csv";

    $sku_entry=array();

    $updates_handle=fopen($updates_file, 'r');
    if($updates_handle) { 
        while($sku_entry=fgetcsv($updates_handle, 1000, ",")) { 
            $old_sku=$sku_entry[0];
            $new_sku=$sku_entry[1];
            echo "<br>Updating ".$old_sku." to ".$new_sku." - ";
            try {
                $get_item = Mage::getModel('catalog/product')->loadByAttribute('sku', $old_sku);

                if ($get_item) {
                    $get_item->setSku($new_sku)->save();
                    echo "successful";
                } else {
                    echo "item not found";
                }
            } catch (Exception $e) { 
                echo "Cannot retrieve products from Magento: ".$e->getMessage()."<br>";
                return;
            }
        }
    }

    fclose($updates_handle);

Ответы [ 2 ]

1 голос
/ 09 января 2012

В вашем сообщении недостаточно информации, чтобы точно отследить это. Когда вы сохраняете информацию о продукте в Magento, появляется несколько таблиц, информацию о которых необходимо обновить. Одна из этих таблиц имеет уникальный ключ из четырех столбцов, который по какой-то причине ваша система пытается обновить с помощью информации, которая может привести к тому, что четыре столбца в этом ключе будут дубликатом другой строки

Integrity constraint violation: 1062 Duplicate entry '168-122-1-7' for key 1

Вам необходимо выяснить, что это за таблица, а затем выяснить, почему Magento может вызывать это обновление. Самый быстрый способ сделать это - добавить несколько слов

lib/Zend/Db/Adapter/Abstract.php

Это класс, через который большинство запросов к базе данных направляются в Magento. Добавьте свою регистрацию в методы update и insert. Ищите место, где создаются строки SQL

    $sql = "UPDATE "
         . $this->quoteIdentifier($table, true)
         . ' SET ' . implode(', ', $set)
         . (($where) ? " WHERE $where" : '');


    $sql = "INSERT INTO "
         . $this->quoteIdentifier($table, true)
         . ' (' . implode(', ', $cols) . ') '
         . 'VALUES (' . implode(', ', $vals) . ')';

С этой регистрацией вы будете знать, какую последнюю таблицу Magento пытался вставить или обновить, прежде чем выдать это исключение, которое должно предоставить вам информацию, необходимую для устранения неполадок.

0 голосов
/ 09 января 2012

Лучше всего использовать API для такого рода вещей.

http://www.magentocommerce.com/wiki/doc/webservices-api/api/catalog_product#catalog_product.update

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