簡體   English   中英

如何在Rails 3中實現批量插入

[英]How to implement bulk insert in Rails 3

我需要將一組電子郵件作為不同的記錄插入到我的聯系人表中。 如何才能做到這一點。

Eg: @email = ["a@b.com", "c@d.com", "e@f.com", ... ]

我不想用。

  @email.each do |email|
     @contact = Contact.new
     @contact.email = email
     @contact.save
  end

這導致n插入quires。 我只需要一個插入查詢來插入這些值。 如何在rails 3.0.9(以及理想的MySQL)中完成。 請幫忙

activerecord-import實現AR#import

activerecord-import是一個使用ActiveRecord批量插入數據的庫。

看看它怎么運作:

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

Project的主頁位於Github ,它是wiki

您也可以嘗試upsert ,這幾乎和activerecord-import一樣快,但只適用於(當前)MySQL,Postgres和SQLite3:

require 'upsert'
Upsert.batch(Contact.connection, Contact.table_name) do |upsert|
  emails.each do |email|
    upsert.row(email: email)
  end
end

請注意,這涉及每個記錄一個數據庫查詢,但它是一個“upsert”,因此您不必檢查記錄是否已存在。 在您的示例中,這不是一個問題,但在大多數應用程序中,它最終成為一個問題。

沒有額外gem的最簡單方法是連接一個字符串並在一次SQL插入中執行它( http://www.electrictoolbox.com/mysql-insert-multiple-records/ )。

@email = ["a@b.com", "c@d.com", "e@f.com"]

time = Time.current.to_s(:db)

values = @email.map do |email|
  "('#{email}', '#{time}', '#{time}')"
end

sql = "INSERT INTO contacts (email, created_at, updated_at) VALUES #{values.join(', ')}"
Contact.connection.execute(sql)

我剛剛為Active Record 3.2寫了一個小小的補丁,用一個SQL查詢插入許多新記錄,檢查出來:

https://github.com/alexdowad/showcase/blob/master/activerecord/bulk_db_operations.rb

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM