2010-10-21 28 views
5

我有大約50,000條記錄要在Magento商店中導入。我已經測試過的: 該文件大約爲50 MB。如何使用直接連接到數據庫來導入Magento中的產品

  • 劈裂文件
  • API
  • Magento的類

分割文件不提高產品的進口速度。 Api非常慢。 Magento類很慢。

這是使用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(); 

所以上面的方法是正確的,但它花費約5小時,以便插入只有2300條記錄!

哪些是我必須在Magento數據庫中執行以添加新產品的簡單SQL插入?

+0

嗨。你終於完成了如何直接導入到數據庫? – Sol 2015-11-17 09:29:28

+0

Hi @Sol yes!我爲我的公司創建了一個模塊,通過對數據庫的直接查詢保存所有數據,但不幸的是我無法共享它。 – Michelangelo 2015-11-17 10:09:24

+0

不錯 - 是不是很辛苦?我想知道開發這種模塊需要多少時間和精力。你能不能簡短地描述它是做什麼的? – Sol 2015-11-17 12:22:21

回答

2

使用原始SQL查詢創建產品非常困難,因爲Magento使用EAV模式來存儲產品。

+2

是的,但我是一名開發人員;) – Michelangelo 2010-10-22 11:40:20

+1

因此,使用調試器並調查SQL查詢以添加產品:) – 2010-10-22 16:25:34

+0

Ok完成!我已經在4小時內插入了50000條記錄!現在的問題是重新索引Magento目錄URL重寫! – Michelangelo 2010-10-23 08:17:39

3

我強烈建議您避免不惜一切代價編寫原始SQL,您幾乎可以肯定會花費數天時間編寫映射屬性ID並可能弄錯它。它也將繞過所有Magento依賴的重要索引和其他系統更新。

如果速度是你的問題,我建議你考慮來自Unirgy的uRapidFlow。通常的免責聲明適用,我與Unirgy沒有任何關係,但我的觀察一直認爲這項工作的質量非常好。

HTH, JD

+1

我很同意你的精神,但有一個規模(成千上萬的記錄),我沒有找到一個用於導入記錄的框架內解決方案。在運行開始時加載ID的小封裝器可以減輕您提出的風險,並使手動導入成爲可行的解決方案。 – 2010-10-21 12:52:50

+1

我懷疑這些所有重要指標都是這些規模最大的放緩。在這種情況下手動編寫SQL可能是有益的,可以在之後重建索引。 – clockworkgeek 2010-10-21 21:53:23

+0

@約瑟夫,好主意加載插入的產品,並「告知」法師他們的存在。 @clockworkgeek - 毫無疑問,你是對的,它是索引,但也可能是一些外鍵關係。任何能解決這個問題的人都有可能賺到很多錢(正如我懷疑Unirgy發現的那樣!)。 – 2010-10-21 22:55:38

1

,通過首先創建一個模板模型工作,偶爾我注意到批量插入...

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

...然後避免爲每個記錄模式的創建...

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

它稍微更有效但可能不足以讓大量導入到合理的時間。

+1

在這些導入上使用profiler會很有趣。實際上,掛入Magento的分析器非常簡單,我發現它有助於追蹤導航渲染器的瓶頸。我懷疑是'save()'是昂貴的步驟,而不是'getModel()',但分析將證明它。如果你可以在一個集合中創建所有的對象,然後一步完成集合,而不是單獨的每一個產品,那將是很好的事情......嗯。 – 2010-10-21 22:53:34

+0

這很慢! – Michelangelo 2010-10-22 11:39:49

3

如果您在負載運行時禁用索引器,然後重新啓用並在之後運行,它應該會縮短加載時間。

$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

reindex時間保持不變。 – Michelangelo 2011-12-06 21:42:54

+1

加載時間如何?重建時間不會有太大的改變。這樣做會告訴Magento在每個產品對象保存後都不會編制索引。 – 2011-12-06 22:18:18

+0

是的,對!每個產品花費的時間約爲10秒。 – Michelangelo 2011-12-07 06:49:05

相關問題