コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

activerecord-importでバルクインサート / バルクアップデートする

Railsのデフォルトで大量のデータをinsertすると、1レコードずつinsertするのでDBが悲鳴をあげる可能性がある。それを防ぐgemとして activerecord-import があるのでそれを使う。

このgemはupdateも一気に出来るのでそれも紹介する。

環境

rails (5.1.5)
activerecord-import (0.23.0)

インストール

以下を Gemfile に追加

gem "activerecord-import", "~> 0.23.0"

使い方

素のActiveRecordに使う場合はgemがインストールしてれば使えるので特に設定等の追記は必要なし。

一応色々やり方はあるんですが、割とシンプルな方法を今回はご紹介。

bulk insert

{{テーブルのモデル}}.import {{insertしたいモデルを持つ配列}}

みたいな感じなので、実際は以下の感じ。(動作未検証)

names = ["Taro","Ziro","Sato"]
users = []
names.each do |name|
  users << User.new(name: name)
end

User.import users

bulk update

{{テーブルのモデル}}.import {{updateしたい値に差し替えたモデル}} on_duplicate_key_update: {{アップデートしたいカラムのシンボルの配列}}

みたいな感じなので、これも実際は以下の感じ。(動作未検証)

no_name_users = User.where(name: nil)
update_users = []
no_name_users.each do |users|
  users.name = "NoName"
  update_users << users
end

# nameだけUpdate
User.import update_users  on_duplicate_key_update:[:name]

参考サイト