我有以下代码将CSV的列表从旧值更新为新值。但是它会触发某些产品的错误:
无法从Magento检索产品:SQLSTATE [23000]:完整性约束违规:1062密钥1的重复条目“168-122-1-7”
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);
答案 0 :(得分:1)
您的帖子中没有足够的信息来准确跟踪此信息。在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在抛出该异常之前尝试插入或更新的最后一个表,这应该为您提供排除故障所需的信息。
答案 1 :(得分:0)