activerecord-import가 역시 신이었던 이야기

개요 & 부탁



이번에 gem activerecord-import 를 사용해 감동한 이야기를 적는다.
도입 부분은 bundle insatll 할 뿐이므로 생략한다.
아시는 분은 스루 & 틀렸다면 지적 부탁드립니다

activerecord-import 란 무엇인가



ActiveRecord를 사용하여 데이터를 대량 삽입하는 라이브러리.
each로 빙빙 돌려 1건씩 레코드 추가 갱신은 부하가 걸리기 때문에 벌크 인서트/벌크 업데이트를 사용하자.

여기가 좋다.


  • N + 1 대책 해준다
  • 아래 링크와 같이 on_duplicate_key_update:를 설정하면 새로운 추가 또는 업데이트 로직을 의식하지 않고 구현할 수 있습니다.
  • htps : // 기주 b. 코 m / z 덴이 s / 아 c ゔ ぇ 레코 rd m rt / # 즈 p ぃ 카테 - y yu p


  • 착각했던 것


  • 이하 target_users를 작성할 때, 신규 작성과 갱신으로 로직을 바꿔야 하는지 생각하고 있었다 (알기 어렵지만 before 참조)

  • before(동작은 미확인)



    hoge.rb
    target_users = []
    # 一括で登録したいユーザー情報
    user_lists = [{key: 'hoge', name: 'ほげ'}, {key: 'fuga', name: 'ふが'}, {key: 'piyo', name: 'ぴよ'}]
    users = User.all
    
    # 新規作成
    if users.blank?
        user_lists.each do |user_list|
            target_users << User.new(
                key: user_list['key'],
                name: user_list['name']
            )
        end
    # 更新の場合は
    else
        user_lists.each do |user_list|
            users.each do |user|
                next unless user.key == user_list.key
                user.name = user_list.name
                target_users << user
            end
        end
    end
    User.import target_users, on_duplicate_key_update:[:name]
    

    A "A"A "A"A"A"A"A"A"A"긴 긴 긴

    after



    hoge.rb
    target_users = []
    user_lists = [{key: 'hoge', name: 'ほげ'}, {key: 'fuga', name: 'ふが'}, {key: 'piyo', name: 'ぴよ'}]
    
    user_lists.each do |user_list|
        target_users << User.new(
            key: user_list['key'],
            name: user_list['name']
        )
    end
    User.import target_users, on_duplicate_key_update:[:name]
    

    실은 이것만으로 신규 추가도 갱신도 좋게 해 주었다
    나는 키모이키모이라고 생각했던 코드가 전부 없어져서 감동했다

    ! on_duplicate_key_update:는 MySQL, PostgreSQL (9.5 이상), SQLite (3.24.0 이후)에서 설정이 지원되지만 PostgreSQL은 미묘하게 작성하는 방법이 다르므로주의가 필요합니다.

    마지막으로



    Rails6에서 insert_all, insert_all!, upsert_all이 추가되었으므로 activerecord-import가 더 이상 사용되지 않습니다 ...
    잡잡이지만 끝.

    좋은 웹페이지 즐겨찾기