복붙노트

[RUBY-ON-RAILS] 어떻게 레일에 대량 삽입을 구현하는 3

RUBY-ON-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

이 원인과 삽입 쿼리. 난 그냥이 값을 삽입 할 하나의 삽입 쿼리가 필요합니다. 어떻게 이런 일이 레일 3.0.9 (이상적으로 MySQL의)에서 수행 할 수 있습니다. 도와주세요

해결법

  1. ==============================

    1.액티브 가져 오기 구현은 # 가져 오기를 AR

    액티브 가져 오기 구현은 # 가져 오기를 AR

    액티브 가져 오기는 액티브를 사용하여 대량 삽입 데이터에 대한 라이브러리입니다.

    작동 방법 :

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

    프로젝트의 홈은 Github에서에 그것은 위키입니다.

  2. ==============================

    2.또한 액티브 수입으로 약 빠른 속도 인 upsert 시도하지만 MySQL은, 포스트 그레스, 및 sqlite3를로 (현재) 작품 수 :

    또한 액티브 수입으로 약 빠른 속도 인 upsert 시도하지만 MySQL은, 포스트 그레스, 및 sqlite3를로 (현재) 작품 수 :

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

    참고이 레코드 당 하나 개의 데이터베이스 쿼리를 포함하지만, 당신이 레코드가 이미 존재 여부를 확인하지 않아도 그것은 "upsert"는 있다고. 당신의 예에서,이 문제가되지 않습니다 만, 대부분의 응용 프로그램에 결국 하나가됩니다.

  3. ==============================

    3.추가 보석없이 가장 간단한 방법은 문자열을 CONCAT 하나 개의 SQL 삽입 (http://www.electrictoolbox.com/mysql-insert-multiple-records/)에서 그것을 실행하는 것입니다.

    추가 보석없이 가장 간단한 방법은 문자열을 CONCAT 하나 개의 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)
    
  4. ==============================

    4.난 그냥 체크 아웃, 단일 SQL 쿼리와 함께 많은 새로운 레코드를 삽입하기 위해 액티브 레코드 3.2을위한 작은 원숭이 - 패치를 썼다 :

    난 그냥 체크 아웃, 단일 SQL 쿼리와 함께 많은 새로운 레코드를 삽입하기 위해 액티브 레코드 3.2을위한 작은 원숭이 - 패치를 썼다 :

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

  5. from https://stackoverflow.com/questions/8505263/how-to-implement-bulk-insert-in-rails-3 by cc-by-sa and MIT license