LoginSignup
17
18

More than 3 years have passed since last update.

Railsでバルクインサート!

Last updated at Posted at 2019-07-03

はじめに

今回は、Railsでバルクインサートを使用する方法をご紹介します!:information_desk_person:

バルクインサートとは

あるテーブルに複数のデータ(レコード)を保存したい時に便利です。
通常だと1レコードずつINSERTが発行されるので、膨大な量を保存するとなるととても時間がかかります。
これを防ぐために!
保存したいデータ情報を一度全て配列に入れてから、一気に保存する!のがバルクインサートです:fist:
つまりは膨大な保存データをSQLで一括登録する方法です。

下準備

Railsでバルクインサートしたい場合には、まずgemを入れます。
Gemfileに以下を追加!

gem 'activerecord-import'

そして忘れすにターミナルでbundle install !!

$ bundle install

これで下準備終了です!

使い方① createする場合

では早速使用していきましょう!
まずは例として、バルクインサートを使用せずに、一つ一つのデータごとにINSERTを走らせて保存するやり方です。

test.rb
10.times do |i|
  Book.create! name: "book #{i}"
end

booksテーブルにbook1,book2,book3と一つ一つデータを保存する例です。
一つずつ保存する旅にcreateアクションが走るので、保存データ量が多い場合はとても動作が遅くなります。

test.rb
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をオプションで付けるだけです!

test.rb
モデル名.import 配列名, on_duplicate_key_update: [:カラム名]

先ほどのbooksテーブルのtitleカラムを一気に変更する場合は、

test.rb
Book.import books, on_duplicate_key_update: [:title]

このようになります!

さいごに

gemを入れるだけでこんなに便利に!簡単にバルクインサートできるんですね!
ただしバルクインサートを使用する際はコールバックが発火しないので注意が必要です!
コールバックがない場合はぜひバルクインサートでさくさくデータ保存してみてください:v:

参考URL

①gem 'activerecord-import'のgithubです!
 https://github.com/zdennis/activerecord-import
②バルクインサートを使用した場合としない場合のパフォーマンスをまとめている良記事
 https://qiita.com/xhnagata/items/79184ded56158ea1b97a

17
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
18