Rails 마이그레이션 : 열의 기본 설정 실행 취소


190

이 예제와 같이 열의 기본 설정을 설정하는 Rails 마이그레이션이 문제가 있습니다.

def self.up
  add_column :column_name, :bought_at, :datetime, :default => Time.now
end

나중에 마이그레이션 할 때 기본 설정을 삭제하고 싶습니다. 레일 마이그레이션을 사용하여 어떻게 설정합니까?

현재 해결 방법은 다음과 같이 rails 마이그레이션에서 사용자 지정 sql 명령을 실행하는 것입니다.

def self.up
  execute 'alter table column_name alter bought_at drop default'
end

그러나 기본 데이터베이스가이 명령을 해석하는 방법에 따라 달라지기 때문에이 방법이 마음에 들지 않습니다. 데이터베이스가 변경되면이 쿼리가 더 이상 작동하지 않을 수 있으며 마이그레이션이 중단 될 수 있습니다. 그렇다면 레일의 열에 대한 기본 설정 실행 취소를 표현하는 방법이 있습니까?

답변:


387

레일 5+

def change
  change_column_default( :table_name, :column_name, from: nil, to: false )
end

레일 3 및 레일 4

def up
  change_column_default( :table_name, :column_name, nil )
end

def down
  change_column_default( :table_name, :column_name, false )
end

7
postgres에서는 실제로 CHARACTER VARYING열의 기본값을 삭제하지 않고 그냥 설정하십시오 NULL::character varying.
Attila O.

8
최신 버전에서는 뒤집을 수 있습니다. 예 : change_column_default(:table_name, :column_name, from: nil, to: false)
Mark

1
@AttilaO. 나는 성공의 실행을 했어 ALTER TABLE table_name ALTER COLUMN type DROP DEFAULT, 그것을 설정할 필요 NULL내가 생각합니다.
Eli Rose-REINSTATE MONICA

참고로, @Mark에서 언급 한 가역 버전은 Rails 5+에 추가되었으므로 그 아래의 어떤 것도 사용할 수 없습니다.
Joshua Pinter

23

소리 와 함께 당신처럼 옳은 일을하고있는 당신의 워드 프로세서는 지적과 같이, '실행'

change_column_default(table_name, column_name, default)

열의 새 기본값을 설정합니다. 기본값을 NULL로 설정하려면 운이 좋지 않습니다. 적절한 SQL 문을 직접 DatabaseStatements # execute해야합니다.

change_column_default(:suppliers, :qualification, 'new')
change_column_default(:accounts, :authorized, 1)

감사! 나는 스스로 문서 에서이 힌트를 찾지 못했습니다! 그들은 미래의 레일 버전에서 기본값을 마이그레이션으로 떨어 뜨릴 것으로 기대합니다.
wulfovitch

1
Rails 3.1.0, cfr.에서는 더 이상 사실이 아닙니다. apidock.com/rails/v3.1.0/ActiveRecord/ConnectionAdapters/…
비대칭

14

다음 스 니펫은 NULL열 을 만드는 데 사용 NOT NULL하지만 DEFAULT스키마 수준 에서는 건너 뜁니다 .

def self.up
  change_column :table, :column, :string, :null => false, :default => ""
  change_column_default(:table, :column, nil)
end

허용 된 것과 동일한 상태 이므로이 답변에 부가 가치가 표시되지 않습니다.
Mosselman

-3

레일 4

change_column :courses, :name, :string, limit: 100, null: false

10
이 사람은 DEFAULT와는 아무 상관이없는, NOT NULL 제약 조건을 추가
외삽

DEFAULT +1과 아무 관련이 없습니다
Ivan Wang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.