使用seeds.rb导入大量数据到数据库
条评论最近有个Rails项目,需要把大量的单词导入到数据库里,看我的艰辛历程…
第一个想法
我第一想法是编写seeds.rb,自然而然想到使用下面的方式
1 | # 清空单词数据表 |
我现在看到这样的代码都想笑,没办法,我第一反应就这样。每个单词新建一个对象,赋值,储存。
单词数量也没很多,3000个。嗯,我等了一分钟都没跑完,就提前终止掉了,这哪能忍…
改进(逃…
我查了一下Rails的文档,发现了create方法,好像要效率高点。
1 | words.each do |w| |
没错我还是想死,这次我等了大概一两分钟,跑完了。问了一下队友
导入三千个单词要2分钟你能忍吗?
不能。
好的,我也不能…
原生SQL语句大法
于是我Google了一下 rails insert mass rows 查到了这篇文章,作者用四种方式插入一万条数据。前面介绍的和我一开始想的差不多,效率很低。
然后作者给出了原生SQL方式,并用Benchmark测试出效率是其他方法数十倍。
按照刚才的例子,代码如下:
1 | # 形成SQL语句需要的规范形式 |
原理是用了SQL中这样的语法:
INSERT INTO MyTable ( Column1, Column2 ) VALUES ( Value1, Value2 ), ( Value1, Value2 ), ( Value1, Value2 )
整个过程不到一秒,不说了我去学SQL了。。。
如有疏漏,欢迎评论指出,或者前往Github提出issue~谢谢