By

(Rails) BULK INSERT、BULK UPDATEの実装方法

ビジネスバンクグループ エンジニア の高橋 慶太です。

今回は、Railsにおいて、BULK-INSERTおよびBULK-UPDATEによるDB更新を行う方法について書きたいと思います。

使用するGem

以下のactiverecord-importというGemを使用します。
GitHub: activerecord-import

  gem 'activerecord-import'

BULK INSERTとは?

BULK INSERTとはあるテーブルに対するINSERTの処理を、1つのSQLで一括で登録する方法です。
バッチ処理で大量データを登録する場合など、BULK INSERTを行うことで処理時間を短縮することができます。

BULK INSERTの実装方法

通常、RailsのActiveRecordでDBへ保存する場合は、下記のように記述します。

  # Sampleテーブルに対して、3レコードをActiveRecordで1レコードずつ保存する場合
  3.times do |i|
    sample = Sample.new(sample_column: i)
    sample.save!
  end

BULK INSERTを使って登録する場合、下記のように記述します。

  # Sampleテーブルに対して、3レコードをBULK INSERTで一括で登録する場合
  samples = []
  3.times do |i|
    samples[] << Sample.new(sample_column: i)
  end
  # ここで一括登録処理が行われる
  Sample.import samples

BULK UPDATEの実装方法

RailsでBULK UPDATEを行う方法には、2つの方法があります。

1.「on_duplicate_key_update」を指定する (MySQL限定)

「on_duplicate_key_update」で更新対象とするカラム名を指定する方法です。
ただし、この方法はMySQL限定の構文を使用したものであるため、MySQL以外のDBでは使用できません。

  # Sampleテーブルに対して、3レコードをBULK INSERTで一括で登録する場合
  samples = Sample.all
  samples.each_with_index do |sample, i|
    sample.sample_column1 = i
  end
  # sample_column1カラムのみ更新
  Sample.import samples, on_duplicate_key_update: [sample_column1]

2. update_allを使用する

Railsのupdate_allを使用する方法です。
この方法は、ActiveRecordのメソッドであるため使用可能なDBの制限はありません。
ただし、この方法は「全レコードに対して同じ値を設定する場合のみ」しか使えない点に注意が必要です。

  samples = Sample.all
  samples.update_all(sample_column1: 123)

エンジニア募集中!

ビジネスバンクグループではエンジニアを募集中しています。

弊社が採用しているテクノロジや開発環境に興味を持った方は、 ここから是非エントリー を!