はじめに
今回は、Railsでバルクインサートを使用する方法をご紹介します!
バルクインサートとは
あるテーブルに複数のデータ(レコード)を保存したい時に便利です。
通常だと1レコードずつINSERTが発行されるので、膨大な量を保存するとなるととても時間がかかります。
これを防ぐために!
保存したいデータ情報を一度全て配列に入れてから、一気に保存する!のがバルクインサートです
つまりは膨大な保存データをSQLで一括登録する方法です。
下準備
Railsでバルクインサートしたい場合には、まずgemを入れます。
Gemfileに以下を追加!
gem 'activerecord-import'
そして忘れすにターミナルでbundle install !!
$ bundle install
これで下準備終了です!
使い方① createする場合
では早速使用していきましょう!
まずは例として、バルクインサートを使用せずに、一つ一つのデータごとにINSERTを走らせて保存するやり方です。
10.times do |i|
Book.create! name: "book #{i}"
end
booksテーブルにbook1,book2,book3と一つ一つデータを保存する例です。
一つずつ保存する旅にcreateアクションが走るので、保存データ量が多い場合はとても動作が遅くなります。
books = []
10.times do |i|
books << Book.new(name: "book #{i}")
end
Book.import books
このようになります!
まずは配列booksを用意しておき、新しいデータを配列booksに順番に入れておきます。
そして最後、Book.import books で保存するデータを一気にcreateしています。
使い方② updateする場合
updateする場合はon_duplicate_key_updateをオプションで付けるだけです!
モデル名.import 配列名, on_duplicate_key_update: [:カラム名]
先ほどのbooksテーブルのtitleカラムを一気に変更する場合は、
Book.import books, on_duplicate_key_update: [:title]
このようになります!
さいごに
gemを入れるだけでこんなに便利に!簡単にバルクインサートできるんですね!
ただしバルクインサートを使用する際はコールバックが発火しないので注意が必要です!
コールバックがない場合はぜひバルクインサートでさくさくデータ保存してみてください
参考URL
①gem 'activerecord-import'のgithubです!
https://github.com/zdennis/activerecord-import
②バルクインサートを使用した場合としない場合のパフォーマンスをまとめている良記事
https://qiita.com/xhnagata/items/79184ded56158ea1b97a