(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)
エンジニア募集中!
ビジネスバンクグループではエンジニアを募集中しています。
弊社が採用しているテクノロジや開発環境に興味を持った方は、 ここから是非エントリー を!