1

我第一次使用 gem bulk_insert: https ://github.com/jamis/bulk_insert

我成功地使用 gem 将记录从一个表批量复制到另一个表。后来,我需要报告新记录的数量。反正我看不到从 那里得到行数bulk_insert,所以我转向return_primary_keysresult_sets获取计数,如自述文件中所示。

我添加inserted =到第 3 行并添加了下面的最后一行:

columns = %i[first_name, last_name, email, referal]

inserted = User.bulk_insert(*columns, ignore: true, return_primary_keys: true) do |bulk|
  bulk.set_size = BATCH_SIZE

  registrants.select(:fname, :lname, :email).find_in_batches(batch_size: BATCH_SIZE) do |batch|
    batch.each do |reg|
      bulk.add [reg.fname, reg.lname, reg.email, 'self-registered']
    end
  end
end

puts "added #{inserted.result_sets.count} self-registered users"

现在,我明白了NoMethodError: undefined method 'result_sets' for nil:NilClassputs线了。

我已经多次阅读自述文件并搜索了没有结果的问题。还检查了我是否获得了最新版本 - 1.7.0

我错过了什么?我怎么去result_sets?或者更好的是,我可以在不检索整个新主键列表的情况下获得记录数吗?

4

2 回答 2

1

根据repo 上的这个问题,您需要先创建一个bulk_insert工人。所以,在你的情况下,我认为它看起来像这样:

columns = %i[first_name, last_name, email, referal]

insert_worker = User.bulk_insert(*columns, ignore: true, return_primary_keys: true)

insert_worker.set_size = BATCH_SIZE

registrants.select(:fname, :lname, :email).find_in_batches(batch_size: BATCH_SIZE) do |batch|
  batch.each do |reg|
    insert_worker.add [reg.fname, reg.lname, reg.email, 'self-registered']
  end
end

puts "added #{insert_worker.result_sets.count} self-registered users"
于 2018-08-30T17:28:06.267 回答
0

我在https://github.com/jamis/bulk_insert/issues/35中找到了答案,归功于 butnaruandrei。我必须先创建 bulk_insert 对象,然后再调用 .add() ......而不是将块传递给带有 .add() 的块。

重要提示:我还必须添加inserter.save!所有添加。没有这个,最后半批永远不会被保存......当传入一个块时它确实被保存了。起初这并不明显,因为一切似乎都在工作......但最后几条记录没有保存它。

此代码正常工作:

columns = %i[first_name, last_name, email, referal]

inserter = User.bulk_insert(*columns, ignore: true, return_primary_keys: true) 
inserter.set_size = BATCH_SIZE

registrants.select(:fname, :lname, :email).find_in_batches(batch_size: BATCH_SIZE) do |batch|
  batch.each do |reg|
    inserter.add [reg.fname, reg.lname, reg.email, 'self-registered']
  end
end

inserter.save!
count = inserter.result_sets.map(&:rows).flatten.count

puts "added #{count} self-registered users"
于 2018-08-30T17:30:00.187 回答