【问题标题】:Inserting Multiple Records at a time into Model [duplicate]一次将多条记录插入模型[重复]
【发布时间】:2013-03-26 14:18:51
【问题描述】:

在将数据插入模型时,我正在寻找一些最佳实践,尤其是在要创建大量记录时,到目前为止,我正在检索一些 XML 并将其保存到模型中

doc = Nokogiri::XML.parse(open(url))
doc.xpath('//xmlns:feed/xmlns:entry[xmlns:title[node()]]').each do |s|

  cid = s.xpath("xmlns:id").text
  email = s.xpath("gd:email/@address").text
  name = s.xpath("xmlns:title").text

  data = Contact.new(
    :cid => cid,
    :email => email,
    :name => name)
  data.save
end

现在这是一条一条地插入记录,我认为这需要很长时间。

我读过一种解决方案是使用事务,或者我可以进行一次批量插入?我的问题是我将从哪一个中受益最多,我将如何重新格式化我已经拥有的每一个?在新设置中看到我当前设置的示例将使我受益,因为我将能够更多地理解它并从中实际学习

任何帮助表示赞赏

谢谢

【问题讨论】:

  • 是的,但是这不应该被关闭,因为@JeffPaquette 为有问题的代码提供了一个工作示例,这与 GEM 提供的默认示例不同
  • 您应该能够自己弄清楚。在我看来,它应该被关闭。这适用于您的特定情况不会对遇到相同问题的其他用户有任何额外的好处。对他们来说,最初的问题已经很清楚了。
  • 我不确定所以我问的原因......你怎么能说它不会使任何其他用户受益,对你来说容易的事情对别人来说不一定容易

标签: ruby-on-rails ruby-on-rails-3 activerecord model transactions


【解决方案1】:

您也可以尝试upsert,它可以让您快速插入记录(在某些测试中,比activerecord-import 更快),而无需先将它们累积到内存中:

require 'upsert'
# [...]
doc = Nokogiri::XML.parse(open(url))
Upsert.batch(Contact.connection, Contact.table_name) do |upsert|
  doc.xpath('//xmlns:feed/xmlns:entry[xmlns:title[node()]]').each do |s|
    cid = s.xpath("xmlns:id").text
    email = s.xpath("gd:email/@address").text
    name = s.xpath("xmlns:title").text
    upsert.row(
      :cid => cid,
      :email => email,
      :name => name
    )
  end
end

这适用于 MySQL、Postgres 和 SQLite3。

【讨论】:

  • 谢谢,我也试试这个,
【解决方案2】:

其他人已经解决了这个问题,解决方案是使用 activerecord-import。见original question...

使用activerecord-import的详细信息在wiki

编辑:如果您不突出显示文本,显然链接按钮不会将链接复制为标题。

doc = Nokogiri::XML.parse(open(url))
data = []
doc.xpath('//xmlns:feed/xmlns:entry[xmlns:title[node()]]').each do |s|

  cid = s.xpath("xmlns:id").text
  email = s.xpath("gd:email/@address").text
  name = s.xpath("xmlns:title").text

  data << Contact.new(
    :cid => cid,
    :email => email,
    :name => name)
end
Contact.import data

【讨论】:

  • 谢谢,但仍然不确定如何使用我的设置来实现,提供的链接也已损坏(我没有 -1 你)你能提供一个例子吗?
  • 好的,所以示例使用 10.times,我不知道要检索多少条记录,所以它是 n.times 的情况...我将如何设置?跨度>
  • 啊,我明白了,谢谢,现在这有帮助,我可以看到发生了什么......
  • 哇,在写入模型 +1 方面有很大改进
  • 您看到了多少改进?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2018-11-11
  • 2016-12-31
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
相关资源
最近更新 更多