Rails6의 표준 기능을 사용한 bulk import

6904 단어 Railstech
bulk import 하면 activerecord-import 한 쌍.
하지만 Rails6에서도 Bulk import 및 Bulk Upsert를 사용할 수 있습니다.

테스트용 repository


https://github.com/junara/sorttest
다음은 insert.all 및 upsertall에서 User의 import 및 upsert를 테스트할 수 있습니다.
rails db:migrate
rails db:seed

Bulk import 예


ActiveRecord의attirbutes의Hash의Aray를 매개 변수insert_all!로 특수 method를 호출합니다.
insert_all
insert_all!
User model은 이런 느낌입니다.
# frozen_string_literal: true

# == Schema Information
#
# Table name: users
#
#  id         :integer          not null, primary key
#  email      :string           not null
#  name       :string           not null
#  created_at :datetime         not null
#  updated_at :datetime         not null
#
# Indexes
#
#  index_users_on_email  (email) UNIQUE
#
class User < ApplicationRecord
  has_many :posts
  has_many :comments
end

Bulk import 10개의 User
require 'faker'

### Example of bulk insert
def user_params
  time = Faker::Time.backward
  {
    name: Faker::Name.name,
    email: Faker::Internet.email,
    created_at: time,
    updated_at: time
  }
end

User.insert_all!(10.times.map { user_params })
pp User.count
#=> 10

Bulk Upsert 예


할 수 있어.Upsert를 수행하려면 Uniq 제한이 있는 열이 필요합니다.
이번 예에서 이메일은 유닉스의 제약을 받았다.
upsert_all
이메일이 중복될 때는 업데이트이고, 이메일이 중복되지 않을 때는 insert입니다.

### Example of Upsert
user = User.first
list = [
  {
    email: user.email,
    name: 'hoge',
    created_at: user.created_at,
    updated_at: Time.now
  },
  {
    email: '[email protected]',
    name: 'fuga',
    created_at: Time.now,
    updated_at: Time.now,
  }
]

User.upsert_all(list, unique_by: :email)

pp User.count
#=> 11
activerecord-imprt보다 편리합니다!그렇게 말하지는 않지만 많은 용도로 충분합니다. 프로젝트에 따라 activerecord-import가 없으면 표준 기능만 bulk import가 가능하다는 것을 기억하는 것이 편리합니다.

좋은 웹페이지 즐겨찾기