批量插入导轨3

pho*_*ard 38 ruby activerecord ruby-on-rails ruby-on-rails-3 rails-postgresql

我想从我的Rails应用程序中将几千条记录批量插入数据库(在我的情况下为POSTGRES).

这样做的"Rails方式"是什么?一些快速且正确的方法.

我知道我可以通过字符串连接属性来创建SQL查询,但我想要一个更好的方法.

Sim*_*tti 59

ActiveRecord .create方法支持批量创建.如果数据库不支持该方法,则该方法会模拟该功能,如果支持该功能,则使用基础数据库引擎.

只需传递一系列选项.

# Create an Array of new objects
User.create([{ :first_name => 'Jamie' }, { :first_name => 'Jeremy' }])
Run Code Online (Sandbox Code Playgroud)

支持阻止,这是共享属性的常用方式.

# Creating an Array of new objects using a block, where the block is executed for each object:
User.create([{ :first_name => 'Jamie' }, { :first_name => 'Jeremy' }]) do |u|
  u.is_admin = false
end
Run Code Online (Sandbox Code Playgroud)

  • 这种方法没有任何魔力.它只是遍历数组并在每个单独的哈希上调用`create`.https://github.com/rails/rails/blob/3e88b9ed0e706906fb4aafe1ea85f990b4f42f48/activerecord/lib/active_record/persistence.rb#L29 (36认同)
  • 它似乎正在创建单独的查询.虽然通过交易围绕它似乎使它更快.我能以任何方式确保插入单个查询吗? (3认同)
  • 它可能取决于驱动程序版本和PG版本.您可以在控制台中尝试它并查看执行的SQL语句. (2认同)
  • 目前还不确定PG驱动程序是否支持它.https://bitbucket.org/ged/ruby-pg/pull-request/13 (2认同)
  • 我最终使用了activerecord-import gem。似乎可以解决问题:) (2认同)

pho*_*ard 20

在@Simone Carletti和@Sumit Munot的两个答案之后,我终于找到了解决方案.

直到postgres驱动程序支持ActiveRecord .create方法的批量插入,我想使用activerecord-import gem.它在单个insert语句中执行批量插入.

books = []
10.times do |i| 
    books << Book.new(:name => "book #{i}")
end
Book.import books
Run Code Online (Sandbox Code Playgroud)

在POSTGRES中,它会导致单个插入状态.

一旦postgres驱动程序在单个insert语句中支持ActiveRecord .create方法的批量插入,那么@Simone Carletti的解决方案更有意义:)