테이블 교체
GitLab v19.1때로는 하나의 테이블을 다른 테이블로 교체해야 할 경우가 있습니다. 예를 들어, events라는 테이블을 events_for_migration이라는 다른 테이블과 교체하려면 다음과 같이 해야 합니다: events를 events_temporary로 이름 변경
때로는 하나의 테이블을 다른 테이블로 교체해야 할 경우가 있습니다. 예를 들어, 매우 큰 테이블에서 데이터를 마이그레이션할 때는 테이블의 복사본을 만들고, 백그라운드에서 이 새 테이블에 데이터를 삽입 및 마이그레이션하는 것이 더 나은 경우가 많습니다.
예를 들어, events라는 테이블을 events_for_migration이라는 다른 테이블과 교체하려면 다음과 같이 해야 합니다:
-
events를events_temporary로 이름 변경 -
events_for_migration을events로 이름 변경 -
events_temporary를events_for_migration으로 이름 변경
Rails에서는 rename_table 메서드를 사용하여 이 작업을 수행할 수 있습니다:
rename_table :events, :events_temporary
rename_table :events_for_migration, :events
rename_table :events_temporary, :events_for_migration
3개의 rename_table 호출이 동일한 데이터베이스 트랜잭션 안에서 실행되는 한, 이 작업에는 다운타임이 필요하지 않습니다. Rails는 기본적으로 마이그레이션에 데이터베이스 트랜잭션을 사용하지만, 그렇지 않은 경우에는 수동으로 트랜잭션을 시작해야 합니다:
Event.transaction do
rename_table :events, :events_temporary
rename_table :events_for_migration, :events
rename_table :events_temporary, :events_for_migration
end
교체가 완료되면 새 테이블의 기본 키를 반드시 재설정해야 합니다. PostgreSQL의 경우 다음과 같이 reset_pk_sequence! 메서드를 사용할 수 있습니다:
reset_pk_sequence!('events')
기본 키를 재설정하지 않으면 새로 생성되는 행이 ID 값 1부터 시작하게 됩니다. 기존 데이터에 따라 중복 키 제약 조건이 발생하여 사용자가 새 데이터를 생성하지 못할 수 있습니다.