2012-08-23 49 views
1

我正在使用Ruby和Datamapper將大量記錄加載到MySQL數據庫中。這些記錄主要是插入,但有相當數量的更新。我基本上想要在數據庫中'插入'這些記錄的所有列。我可以找到的唯一選項是:Datamapper是否支持'在重複鍵更新'或其他技術的upserts?

1)查詢記錄。如果存在,請更新它。如果不是,請創建一條記錄。 (總是一個額外的查詢) 2)嘗試創建一個新的記錄。捕獲重複的鍵錯誤。查詢現有記錄。更新這些記錄。 (當有更新,2個額外的查詢)

我想利用MySQL的On Duplicate Key Update,因爲它似乎更有效。有沒有辦法在Datamapper中做到這一點?還有其他建議嗎?

回答

0

您應該可以使用first_or_create。從docs

zoo = Zoo.first_or_create(:name => 'The Glue Factory') 

我沒有通過grepping在do/do_mysqldm-mysql-adapterOn Duplicate Key Update得到任何比賽,所以它可能不支持它。如果效率對於需要此功能很重要,那麼您可能需要使用純SQL。

+0

是的,我沒有發現它的任何痕跡。我可能必須去這個mysql2。謝謝。 – Charlie

0

這不是一個開箱即用的功能,但是如果您正在進行批量插入,請在事務中執行此操作,即使使用額外的查詢也會更有效。並使用first_or_new,因此您不要在新記錄上進行多次插入。

DataMapper.respository.transaction.commit do 
    Zoo.raise_on_save_failure = true 
    bunch_of_updates.each do |key, new_attributes| 
    zoo = Zoo.first_or_new(the_key: key) 
    zoo.attributes = new_attributes 
    zoo.save 
    end 
end 
+0

很酷。我會在下次記住那個訣竅。不幸的是,我不能像這樣排列我的更新。我正在處理xml記錄,並且在運行插入之前有太多的數據要保留在內存中。它看起來像我將不得不使用mysql2(生產)和sqlite3(測試)'上位'。 – Charlie

+0

Gotcha。你可以直接從DataMapper中使用適配器,比如'DataMapper.repository.adapter.execute(「some sql」)'。或者,您可能只需將datamapper中的查詢保留在內存中並對xml進行流式處理,然後運行像'DataMapper.repository.adapter.create(query)'這樣的查詢。 – RipTheJacker