Development Tip

Rails 마이그레이션 : 존재 여부를 확인하고 계속 진행 하시겠습니까?

yourdevel 2020. 11. 3. 19:19
반응형

Rails 마이그레이션 : 존재 여부를 확인하고 계속 진행 하시겠습니까?


마이그레이션에서 이런 종류의 작업을 수행했습니다.

add_column :statuses, :hold_reason, :string rescue puts "column already added"

그러나 이것이 SQLite에서는 작동하지만 PostgreSQL에서는 작동하지 않는 것으로 나타났습니다 . add_column이 터지면 Exception이 잡혀도 트랜잭션이 종료되어 마이그레이션이 추가 작업을 수행 할 수없는 것 같습니다.

컬럼이나 테이블이 이미 존재하는지 확인 하는 비 DB 분리 방법이 있습니까? 실패하면 구조 블록이 실제로 작동하도록 할 수있는 방법이 있습니까?


Rails 3.0 이상 column_exists?에서는를 사용 하여 열의 존재 여부를 확인할 수 있습니다 .

unless column_exists? :statuses, :hold_reason
  add_column :statuses, :hold_reason, :string
end

table_exists?Rails 2.1까지 거슬러 올라가는 함수 도 있습니다 .


또는 더 짧게

add_column :statuses, :hold_reason, :string unless column_exists? :statuses, :hold_reason

들어 레일 2.X , 당신은 다음과 컬럼의 존재를 확인할 수 있습니다 :

columns("[table-name]").index {|col| col.name == "[column-name]"}

nil을 반환하면 해당 열이 존재하지 않습니다. Fixnum을 리턴하면 열이 존재하는 것입니다. 당연히 {...}이름보다 더 많은 이름으로 열을 식별하려는 경우 사이에 더 많은 선택적 매개 변수를 넣을 수 있습니다 . 예를 들면 다음과 같습니다.

{ |col| col.name == "foo" and col.sql_type == "tinyint(1)" and col.primary == nil }

(이 답변 은 레일에서 조건부 마이그레이션을 작성하는 방법에 처음 게시 되었습니까? )


add_column :statuses, :hold_reason, :string unless Status.column_names.include?("hold_reason")

참고 URL : https://stackoverflow.com/questions/1645230/rails-migrations-check-existence-and-keep-going

반응형