Rails 마이그레이션을 사용하여 열을 삭제하는 방법


답변:


917
remove_column :table_name, :column_name

예를 들어 :

remove_column :users, :hobby

users 테이블에서 취미 열을 제거합니다.


9
그리고 @Powers의 답변에 설명 된 대로이 작업 up과 내부가 down아닌 메소드 를 수행하십시오 change.
XåpplI'-I0llwlg'I-5

7
@ XåpplI'-I0llwlg'I- 의견에 감사드립니다. 변경 방법은 Rails 4 애플리케이션에서 열을 삭제하는 데 사용할 수 있지만 Rails 3에서는 사용해서는 안됩니다. 이에 따라 답변을 업데이트했습니다.
Powers

9
유형을 지정하면 마이그레이션을 되돌릴 수 있으므로 메소드 remove_column :table_name, :column_name, :type, :options내에서도 사용할 수 있습니다 change. 문서에서 : 매개 변수가있는 경우 무시됩니다. 이를 마이그레이션 방법 으로 제공하면 되돌릴 수 있습니다. 이 경우, add_column 사용됩니다. typeoptionschangetypeoptions
Nicolas

24
Rails4에서는 change메소드 에서 컬럼을 제거 할 수 있지만 컬럼 유형을 지정하는 경우에만 가능합니다. 예 remove_column, :table_name, :column_name, :column_type. 그렇지 않으면 마이그레이션을 실행할 때 다음 오류가 발생합니다.remove_column is only reversible if given a type
Dennis

5
그것은 그 주요 대답 주목할 가치가있을 수도 있습니다 존재하는 경우 열을 제거하면 해당 인덱스를 제거하지 않습니다
sameers

371

구 버전의 Rails

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

Rails 3 이상

rails generate migration RemoveFieldNameFromTableName field_name:datatype

18
"rails g"는 "rails generate"의 대안으로 사용될 수 있습니다
Noz

44
rails g migration remove_field_name_from_table_name field_name:datatype또한 작동
스튜어트 넬슨

6
것도 유의 AddXXXtoTTTRemoveXXXFromTTTDATA_TYPE, 적절한 add_column 및 remove_column 문이 생성 될 것이다 : filed_name의 화이트리스트 이격 하였다 될 수 rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integer번의 이동을 이용하여 두 개의 속성을 제거한다. 그 또한 참고 remove_column를 지원하지 않습니다 change당신이 모두를 작성해야하므로, 방법 updown.
Claudio Floreani

3
Rails 4 change가이 를 지원 하는 것 같습니다 . 롤백은 정상적으로 작동합니다.
Unknown_Guy

2
@AdamGrant 나는 되돌릴change 수 있는 방법을 사용하는 경우 * 데이터 유형 (및 다른 모든 필드 수정 자)을 알려 주어야하므로 마이그레이션을 롤백하면 필드가 올바르게 다시 생성 될 수 있다고 생각합니다. * 되돌릴 때 데이터베이스 구조 측면에서 볼 때 물론 해당 열의 데이터는 분명히 손실됩니다.
RFVoltolini

117

Rails 4가 업데이트되었으므로 마이그레이션에서 변경 방법을 사용하여 열을 삭제하면 마이그레이션이 성공적으로 롤백됩니다. Rails 3 애플리케이션에 대한 다음 경고를 읽으십시오.

레일 3 경고

이 명령을 사용할 때 다음을 참고하십시오.

rails generate migration RemoveFieldNameFromTableName field_name:datatype

생성 된 마이그레이션은 다음과 같습니다.

  def up
    remove_column :table_name, :field_name
  end

  def down
    add_column :table_name, :field_name, :datatype
  end

데이터베이스 테이블에서 열을 제거 할 때 change 메소드를 사용하지 마십시오 (Rails 3 앱의 마이그레이션 파일에서 원하지 않는 예).

  def change
    remove_column :table_name, :field_name
  end

Rails 3의 변경 방법은 remove_column과 관련하여 현명하지 않으므로이 마이그레이션을 롤백 할 수 없습니다.


3
다음 갈퀴 DB를 실행 마이그레이션
roxdurazo

1
@Powers-훌륭하고 명확한 답변-다음에 대해 자세히 설명 할 수 있습니다. "Rails 3의 변경 방법은 remove_column과 관련하여 현명하지 않으므로이 마이그레이션을 롤백 할 수 없습니다."
BKSpurgeon

1
@BKSpurgeon-Rails 3에서이 change방법 을 사용 하면 rake db:rollback명령이 오류가 발생합니다. rake db:rollback기본적으로의 반대입니다 rake db:migrate. 이 버그는 Rails 4에서 수정되었습니다 :)
Powers

2
Rails 4에서는 변경 드롭 열을 롤백하려고했습니다. 실패하고 data_type을 지정해야한다고 명시합니다 (답변의 다운 코드에서와 같이)
rmcsharry

1
@rmcsharry와 동일한 문제가 발생했습니다. 내 레일 버전은 4.2.2이며 변경 방법을 사용했습니다. 롤백하려고 할 때 유형이 지정된 경우 remove_column을 되돌릴 수 있다는 오류가 발생했습니다.
M. Habib

38

rails4 앱에서 변경 방법을 사용하여 열을 제거 할 수도 있습니다. 세 번째 매개 변수는 data_type이며 선택 사항으로 옵션을 제공 할 수 있습니다. 문서의 '사용 가능한 변환'섹션에 약간 숨겨져 있습니다 .

class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end

27

이를 수행하는 두 가지 좋은 방법이 있습니다.

remove_column

다음과 같이 remove_column을 사용하면됩니다.

remove_column :users, :first_name

스키마를 한 번만 변경하면됩니다.

change_table 블록

다음과 같이 change_table 블록을 사용하여이 작업을 수행 할 수도 있습니다.

change_table :users do |t|
  t.remove :first_name
end

나는 이것을 더 읽기 쉽기 때문에 이것을 선호하며 한 번에 여러 가지를 변경할 수 있습니다.

지원되는 change_table 메소드의 전체 목록은 다음과 같습니다.

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table


15

레일 5에서는 터미널에서이 명령을 사용할 수 있습니다.

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

예를 들어 테이블 사용자에서 access_level (string) 열을 제거하려면 다음을 수행하십시오.

rails generate migration remove_access_level_from_users access_level:string

그런 다음 다음을 실행하십시오.

rake db:migrate

14

이 이전 경우 (즉, 이러한 열을 제거하기 이전 생성 rake db:migrate)이 있어야 열 드롭 . 이 마이그레이션이 롤백되면 열을 다시 추가 해야 합니다 ( rake db:rollback).

문법 :

remove_column : table_name, : column_name, : type

열을 제거 하고 마이그레이션이 롤백 된 경우 열을 다시 추가합니다 .

예:

remove_column :users, :last_name, :string

참고 : data_type을 건너 뛰면 마이그레이션이 열을 성공적으로 제거하지만 마이그레이션을 롤백하면 오류가 발생합니다.


13

Rails 5.2에 대한 명확하고 간단한 지침

  • 경고 : 데이터베이스에서 열을 제거하면 데이터가 손실됩니다 . 계속하려면 아래를 참조하십시오.
  • 경고 : 아래 지침은 간단한 마이그레이션을위한 것 입니다. 수백만 행과 수백만 행이 포함 된 복잡한 마이그레이션의 경우 실패 가능성을 고려해야하며, 마이그레이션이 신속하게 실행되도록 사용자를 최적화하는 방법과 사용자가 앱을 사용하는 동안의 가능성을 고려해야합니다. 마이그레이션 프로세스가 진행 중입니다. 여러 데이터베이스가 있거나 원격으로 복잡한 것이 있으면 문제가 발생하더라도 나를 비난하지 마십시오!

1. 마이그레이션 생성

터미널에서 다음 명령을 실행하십시오 .

rails generate migration remove_fieldname_from_tablename fieldname:fieldtype

참고 : 테이블 이름은 레일 규칙에 따라 복수 형식이어야합니다.

예:

필자의 경우 테이블 accepted에서 열 (부울 값) 을 제거하고 싶습니다 quotes.

rails g migration RemoveAcceptedFromQuotes accepted:boolean

필드를 테이블에 추가 / 제거 할 때 문서 re : 규칙을 참조하십시오 .

필드를 테이블에 추가하는 마이그레이션을 생성하는 특수한 구문 바로 가기가 있습니다.

레일 생성 마이그레이션 add_fieldname_to_tablename fieldname : fieldtype

2. 마이그레이션을 확인

# db/migrate/20190122035000_remove_accepted_from_quotes.rb
class RemoveAcceptedFromQuotes < ActiveRecord::Migration[5.2]
  # with rails 5.2 you don't need to add a separate "up" and "down" method.
  def change
    remove_column :quotes, :accepted, :boolean
  end
end

3. 마이그레이션을 실행

rake db:migrate

.... 그리고 당신은 경주를 떠납니다!


이제 마이그레이션을 다음과 같이 실행할 수도 있습니다.rails db:migrate
Imran Ali

12

RAILS 5 앱의 열 제거

rails g migration Remove<Anything>From<TableName> [columnName:type]

위의 명령은 db/migrate디렉토리 내에 마이그레이션 파일을 생성합니다 . 스 니펫 블로우는 Rails 생성기에서 생성 한 테이블 예제에서 열 제거 중 하나입니다.

class RemoveAgeFromUsers < ActiveRecord::Migration
  def up
    remove_column :users, :age
  end
  def down
    add_column :users, :age, :integer
  end
end

또한 여기 에서 찾을 수있는 Rails에 대한 빠른 참조 안내서를 만들었습니다 .



10
rails g migration RemoveXColumnFromY column_name:data_type

X = 열 이름
Y = 테이블 이름

편집하다

의견 RemoveXColumnToYRemoveXColumnFromY따라 변경 -마이그레이션이 실제로 수행하고있는 작업에 대한 명확성을 제공합니다.


3
"제거 열 테이블은"그래서 이상한 소리 에서 여기에 더 나은 선택이 될 것으로 보인다.
Sebastian vom Meer

@SebastianvomMeer yes 동의합니다-영어는 'from'으로 훨씬 더 잘 읽습니다
BKSpurgeon

8

테이블에서 열을 제거하려면 다음 마이그레이션을 실행해야합니다.

rails g migration remove_column_name_from_table_name column_name:data_type

그런 다음 명령을 실행하십시오.

rake db:migrate

5

자체적으로 마이그레이션 파일에 추가 할 명령을 아래에 제공하십시오.

rails g migration RemoveColumnFromModel

위의 명령을 실행 한 후 마이그레이션 파일 remove_column 코드를 확인할 수 있습니다.

그런 다음 db를 마이그레이션하십시오.

rake db:migrate


5

다음과 같이 간단한 3 단계만으로 테이블에서 열을 제거합니다.

  1. 이 명령을 쓰십시오

rails g migration remove_column_from_table_name

이 이름과 타임 스탬프에 의해 생성 된 하나의 파일을 터미널에서이 명령을 실행 한 후 (remove_column from_table_name).

그런 다음이 파일로 이동하십시오.

  1. 내부 파일을 작성해야합니다

    remove_column :table_name, :column_name

  2. 마지막으로 콘솔로 이동 한 다음

    rake db:migrate


2

레일 콘솔에서 하나 더

ActiveRecord::Migration.remove_column(:table_name, :column_name)


1

를 통해
remove_column :table_name, :column_name
마이그레이션 파일

다음을 입력하여 레일 콘솔에서 직접 열을 제거 할 수 있습니다.
ActiveRecord::Base.remove_column :table_name, :column_name


1

이렇게하세요;

rails g migration RemoveColumnNameFromTables column_name:type

rails g migration RemoveTitleFromPosts title:string

어쨌든 ActiveRecord는 런타임에 데이터베이스 열을 캐시하므로 열을 삭제하면 앱이 재부팅 될 때까지 예외가 발생할 수 있기 때문에 가동 중지 시간을 고려하는 것이 좋습니다.

참조 : 강력한 마이그레이션


1

간단히, 당신은 열을 제거 할 수 있습니다

remove_column :table_name, :column_name

예를 들어

remove_column :posts, :comment

1

먼저 다음 명령을 실행하여 마이그레이션 파일을 작성하십시오.

rails g migration RemoveAgeFromUsers age:string

그런 다음 프로젝트의 루트 디렉토리에서 다음 명령을 실행하여 마이그레이션을 실행하십시오.

rails db:migrate
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.