2010-10-21 13 views
5

Tengo alrededor de 50,000 de registros para importar en una tienda de Magento. Lo que ya he probado: El archivo tiene aproximadamente 50 MB.¿Cómo debo importar productos en Magento usando una conexión directa a la base de datos?

  • archivos dividido
  • API
  • Clases Magento

dividir el archivo no mejora la velocidad de la importación de los productos. Api son muy lentos. Las clases de Magento son lentas.

Este es un cortado con tijeras de código usando las clases de Magento:

// Build the product 
$product->setIsMassupdate(true) 
     ->setExcludeUrlRewrite(true) 
     ->setManufacturer($this->addManufacturers(utf8_encode($record[4]))) 
     ->setSku($record[3]) 
     ->setAttributeSetId($this->attribute_set)# 9 is for default 
     ->setTypeId(Mage_Catalog_Model_Product_Type::TYPE_SIMPLE) 
     ->setName(utf8_encode($record[5])) 
     ->setCategoryIds($this->getCategories(array($record[0], $record[1], $record[2]))) # some cat id's, 
     ->setWebsiteIDs(array(1)) # Website id, 1 is default 
     ->setDescription(utf8_encode($record[6])) 
     ->setShortDescription($this->shortText(utf8_encode($record[6]), 150)) 
     ->setPrice($price) # Set some price 
     ->setSpecialPrice($special_price) 
     ->setWeight($record[12]) 
     ->setStatus(Mage_Catalog_Model_Product_Status::STATUS_ENABLED) 
     ->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH) 
     ->setTaxClassId(2)  // default tax class 
     ->setPixmaniaimg($record[10]) 
     ->setStockData(array('is_in_stock' => $inStock, 'qty' => $qty)) 
     ->setCreatedAt(strtotime('now')); 

$product->save();  
$ID = is_numeric($productID) ? $productID : $product->getId(); 

Así que el método anterior es correcta, pero pasa alrededor de 5 horas con el fin de insertar sólo 2.300 registros !!

¿Cuáles son las simples inserciones de SQL que tengo que ejecutar en el Magento DB para agregar un nuevo producto?

+0

Hola. ¿Finalmente ha resuelto cómo importar directamente a db? – Sol

+0

Hola @Sol sí! He creado un módulo para mi empresa que guarda todos los datos mediante una consulta directa a la base de datos pero desafortunadamente no puedo compartirlo. – Michelangelo

+0

Bien, ¿fue un trabajo duro? Me gustaría saber qué tiempo y esfuerzo se requiere para desarrollar dicho módulo. ¿Puedes describir brevemente qué hace? – Sol

Respuesta

2

Es muy difícil crear productos utilizando consultas SQL sin procesar, porque Magento usa el patrón EAV para almacenar productos.

+2

Sí, pero soy un desarrollador;) – Michelangelo

+1

Por lo tanto, use el depurador e investigue las consultas SQL para agregar productos :) –

+0

¡Bien hecho! ¡He insertado 50000 registros en 4 horas! ¡¡Ahora el problema es volver a indexar el Magento Catalog URL Rewrites !! – Michelangelo

3

Recomiendo encarecidamente que evite escribir SQL sin procesar a toda costa, seguramente pasará días y días escribiendo para mapear los identificadores de los atributos y probablemente se equivoque. También omitirá toda la indexación importante y otras actualizaciones del sistema en las que Magento confía.

Si la velocidad es su problema, le sugiero que considere uRapidFlow de Unirgy. Se aplican los descargos de responsabilidad habituales, no tengo ninguna afiliación con Unirgy, pero mis observaciones han sido que la calidad de este trabajo es excelente.

HTH, JD

+1

Estoy de acuerdo con usted en espíritu, pero hay una escala (muchos cientos de miles de registros) donde no he encontrado una única solución en el marco para importar registros. Una pequeña envoltura para cargar los ID al comienzo del tiempo de ejecución puede mitigar los riesgos que usted planteó y hacer de la importación manual una solución viable. –

+1

Sospecho que todos los índices importantes son la mayor ralentización en este tipo de escalas. Escribir manualmente SQL en este caso puede ser beneficioso, los índices se pueden reconstruir después. – clockworkgeek

+0

@Joseph, buena idea cargar los productos insertados e "informar" a Mage de su existencia. @clockworkgeek: sin duda tienes razón, son los índices, pero también potencialmente algunas relaciones de claves externas. Cualquiera que pueda resolver este problema tiene el potencial de ganar mucho dinero (¡como sospecho que Unirgy ha descubierto!). –

1

inserciones masivas vez en cuando me he dado cuenta que trabajan creando primero un modelo de plantilla ...

$blankProduct = Mage::getModel('catalog/product'); 

... entonces es mejor evitar la creación del modelo para cada registro ...

$newProduct = clone $blankProduct; 
$newProduct->setIsMassupdate(true) 
    ... 
$newProduct->save(); 

Es un poco más eficiente, pero probablemente no lo suficiente para obtener esa importación masiva a un tiempo razonable.

+1

Sería interesante utilizar el generador de perfiles en estas importaciones. De hecho, es bastante simple engancharme en el generador de perfiles de Magento. Me resultó útil rastrear el cuello de botella en un renderizador de navegación. Mi sospecha es que es el 'save()' que es el paso caro, en lugar del 'getModel()', pero el perfil lo probaría. Sería bueno si pudieras crear todos tus objetos en una colección y luego comprometer la colección en un solo paso, en lugar de cada producto individualmente ... hmmm. –

+0

¡Es muy lento! – Michelangelo

3

Si desactiva el indexador mientras se ejecuta su carga y luego vuelve a habilitarlo y ejecutarlo luego, debería mejorar el tiempo de carga.

$indexer = Mage::getSingleton('index/indexer'); 
$indexer->lockIndexer(); 

// ... run your processing ... 

$indexer->unlockIndexer(); 

// Reindex everything 
$processes = $indexer->getProcessesCollection(); 
foreach ($processes as $process) 
{ 
    // echo 'Processing: ' . $process->getIndexerCode() . "n"; 
    $process->reindexEverything(); 
} 
+0

El tiempo de reindexado sigue siendo el mismo. – Michelangelo

+1

¿Qué pasa con el tiempo de carga? El tiempo de Reindex no va a cambiar mucho. Lo que hace esto es decirle a Magento que no indexe después de guardar cada objeto del producto. –

+0

¡Sí, claro! El tiempo empleado es de aproximadamente 10 segundos por producto. – Michelangelo

Cuestiones relacionadas