InfoGrab DocsInfoGrab Docs

테이블에 일괄 삽입하기

ActiveRecord 객체를 안전하고 효율적으로 대량 삽입하는 BulkInsertSafe API와 BulkInsertableAssociations의 사용 방법을 설명합니다.

대량의 레코드를 한 번에 저장해야 할 때가 있습니다. 컬렉션을 순회하면서 각 레코드를 개별적으로 저장하는 방식은 비효율적입니다. Rails 6에서 도입된 insert_all 은 행 수준(즉, Hash 객체 사용)에서 동작합니다. GitLab은 이를 바탕으로 ActiveRecord 객체를 안전하고 간단하게 대량 삽입할 수 있는 API 세트를 추가했습니다. 대량 삽입을 위한 ApplicationRecord 준비 # 모델 클래스가 대량 삽입 API를 활용하려면 먼저 BulkInsertSafe concern을 포함해야 합니다: class MyModel < ApplicationRecord # 다른 include 구문 # ... include BulkInsertSafe # 마지막에 포함 # ... end BulkInsertSafe concern은 두 가지 기능을 합니다: 모델 클래스에 대해 대량 삽입과 관련하여 안전하게 사용할 수 없는 ActiveRecord API를 사용하는지 검사합니다(자세한 내용은 아래 참조). 한 번에 많은 레코드를 삽입할 수 있는 새로운 클래스 메서드 bulk_insert! 와 bulk_upsert! 를 추가합니다. bulk_insert! 및 bulk_upsert!로 레코드 삽입하기 # 대상 클래스가 BulkInsertSafe 의 검사를 통과하면, 다음과 같이 ActiveRecord 모델 객체 배열을 삽입할 수 있습니다: records = [MyModel.new, ...] MyModel.bulk_insert!(records) bulk_insert! 호출은 항상 새 레코드 삽입을 시도합니다. 반면, 이미 존재하지 않는 레코드는 삽입하면서 기존 레코드는 새로운 값으로 대체하고 싶다면 bulk_upsert! 를 사용할 수 있습니다: records = [MyModel.new, existing_model, ...] MyModel.bulk_upsert!(records, unique_by: [:name]) 이 예에서 unique_by 는 레코드가 고유한 것으로 간주되는 칼럼을 지정하며, 삽입 이전에 해당 레코드가 존재했던 경우 업데이트됩니다. 예를 들어, existing_model 에 name 속성이 있고 같은 name 값을 가진 레코드가 이미 존재한다면, 해당 필드는 existing_model 의 값으로 업데이트됩니다. unique_by 파라미터는 Symbol 로도 전달할 수 있으며, 이 경우 칼럼이 고유한 것으로 간주되는 데이터베이스 인덱스를 지정합니다: MyModel.bulk_insert!(records, unique_by: :index_on_name) 레코드 유효성 검사 # bulk_insert! 메서드는 records 를 트랜잭션 방식으로 삽입하는 것을 보장하며, 삽입 전에 각 레코드에 대해 유효성 검사를 실행합니다. 유효성 검사에 실패하는 레코드가 있으면 오류가 발생하고 트랜잭션이 롤백됩니다. :validate 옵션을 통해 유효성 검사를 비활성화할 수 있습니다: MyModel.bulk_insert!(records,