最近有個Rails項目,需要把大量的單詞導(dǎo)入到數(shù)據(jù)庫里,看我的艱辛歷程...
第一個想法
我第一想法是編寫seeds.rb锻狗,自然而然想到使用下面的方式
# 清空單詞數(shù)據(jù)表
Vocabulary.delete_all
# 讀取單詞祟同,文件中每行一個單詞,所以得到是所有單詞組成的一個數(shù)組
words = IO.readlines("./config/ext/wordlist.txt")
words.each do |w|
# 新建一個Vocabulary對象
v = Vocabulary.new
# 將word字段賦值厢蒜,因為單詞后含有換行符霞势,所以使用chomp
v.word = w.chomp
# 將length字段賦值
v.length = w.chomp.length
# 保存
v.save
end
我現(xiàn)在看到這樣的代碼都想笑,沒辦法斑鸦,我第一反應(yīng)就這樣愕贡。每個單詞新建一個對象,賦值巷屿,儲存固以。
單詞數(shù)量也沒很多,3000個攒庵。嗯嘴纺,我等了一分鐘都沒跑完,就提前終止掉了浓冒,這哪能忍...
改進(逃...
我查了一下Rails的文檔栽渴,發(fā)現(xiàn)了create方法,好像要效率高點稳懒。
words.each do |w|
# 直接創(chuàng)建一個Vocabulary數(shù)據(jù)
Vocabulary.create(word: w.chomp, length: w.chomp.length)
end
沒錯我還是想死闲擦,這次我等了大概一兩分鐘,跑完了场梆。問了一下隊友
導(dǎo)入三千個單詞要2分鐘你能忍嗎墅冷?
不能。
好的或油,我也不能...
原生SQL語句大法
于是我Google了一下rails insert mass rows 查到了這篇文章寞忿,作者用四種方式插入一萬條數(shù)據(jù)。前面介紹的和我一開始想的差不多顶岸,效率很低腔彰。
然后作者給出了原生SQL方式,并用Benchmark測試出效率是其他方法數(shù)十倍辖佣。
按照剛才的例子霹抛,代碼如下:
# 形成SQL語句需要的規(guī)范形式
# 像這樣 ('F**K', '2016-04-27 20:00:00', '2016-04-28 20:00:00', 4)
words.map!{|w| ("('#{w.chomp}', '2016-04-27 20:00:00', '2016-04-28 20:00:00' , #{w.chomp.length} )") }
# 構(gòu)造SQL語句用于執(zhí)行
sql = "INSERT INTO vocabularies (word, created_at, updated_at, length) VALUES #{words.join(", ")}"
# 執(zhí)行SQL語句
ActiveRecord::Base.connection.execute sql
原理是用了SQL中這樣的語法:
INSERT INTO MyTable ( Column1, Column2 ) VALUES ( Value1, Value2 ), ( Value1, Value2 ), ( Value1, Value2 )
整個過程不到一秒,不說了我去學(xué)SQL了卷谈。杯拐。。
如有疏漏,歡迎評論指出端逼,或者前往Github提出issue~謝謝