Rails 마이그레이션에서 기존 테이블에 열 추가


340

:email열 이 필요한 사용자 모델이 있습니다 (초기 스캐 폴드 중에 해당 열을 추가하는 것을 잊었습니다).

나는 마이그레이션 파일을 열어 추가 t.string :email, 한 rake db:migrate, 그리고있어 NoMethodError. 그런 다음 줄을 추가했습니다

add_column :users, :email, :string

rake db:migrate다시 NoMethodError. 여기 단계가 빠졌습니까?

편집 : 다음은 마이그레이션 파일입니다.

class CreateUsers < ActiveRecord::Migration  
  def self.up  
    add_column :users, :email, :string  
    create_table :users do |t|  
      t.string :username  
      t.string :email  
      t.string :crypted_password  
      t.string :password_salt  
      t.string :persistence_token  

      t.timestamps  
    end  
  end  

  def self.down  
    drop_table :users  
  end  
end

답변:


573

원래 마이그레이션을 이미 실행 한 경우 (편집하기 전에) 새 마이그레이션을 생성 rails generate migration add_email_to_users email:string해야합니다 (트릭을 수행함). 행을 포함하는 마이그레이션 파일을 만듭니다. add_column :users, email, string 그런 다음 a rake db:migrate를 수행하고 새 마이그레이션을 실행하여 새 열을 만듭니다.

원래 마이그레이션을 아직 실행하지 않은 경우 편집하려는 것처럼 편집 할 수 있습니다. 마이그레이션 코드는 거의 완벽합니다. add_column행을 완전히 제거하면 됩니다 (테이블이 작성되기 전에 테이블에 열을 추가하려고 시도하고 테이블 작성 코드가 이미 포함되어 있습니다 t.string :email).


6
분명히하기 위해, 우리는 복수형을 사용합니까? 그래서 add_email_to_users그렇지 add_email_to_user않습니까?
Purplejacket

9
옳은. Rails의 테이블 이름은 항상 복수입니다 (DB 규칙과 일치).
camdez

2
rails db:migrate마지막 단계 에도 사용할 수 있습니다 .
Dylan Vander Berg

테이블의 특정 위치에 새 열을 만들 수 있습니까? 예를 들어 기존 "이메일"필드 바로 뒤에 새 필드 "상태"를 작성하려면?
neeraj

2
@neeraj 당신은 아마 지금까지 대답을 가지고 있지만 다른 구직자들에게는, 예를 들어 t.string :column_x, limit: 10, after: :column_y(레일 4 이상)
244an

123

레일 콘솔에서이 명령을 사용하십시오

rails generate migration add_fieldname_to_tablename fieldname:string

rake db:migrate

이 마이그레이션을 실행하려면


57

때때로 rails generate migration add_email_to_users email:string이와 같은 마이그레이션을 생성합니다

class AddEmailToUsers < ActiveRecord::Migration[5.0]
  def change
  end
end

이 경우 당신은 수동으로해야 add_columnchange:

class AddEmailToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :email, :string
  end
end

그런 다음 실행 rake db:migrate


1) 터미널 rails generate migration add_email_to_users email:string이후 bundle exec rails c또는 터미널 내에서만 실행 해야합니까 ? 2) 쿼리를 실행하면 생성 된 파일은 어디에 배치됩니까?
sofs1

28

당신은 또한 할 수 있습니다

rake db:rollback

테이블에 데이터를 추가하지 않은 경우 전자 메일 열을 추가하여 마이그레이션 파일을 편집 한 다음

rake db:migrate

시스템에 rails 3.1 이상이 설치되어있는 경우 작동합니다.

가장 간단한 방법은 변경으로 마이그레이션 파일의 변경을 그대로 허용하는 것입니다. 사용하다

$rake db:migrate:redo

마지막 마이그레이션을 롤백하고 다시 마이그레이션합니다.


21

열을 추가하려면 다음 단계를 수행해야했습니다.

  1. rails generate migration add_fieldname_to_tablename fieldname:string

    대안

    rails generate migration addFieldnameToTablename

    마이그레이션이 생성되면 마이그레이션을 편집하고 해당 열에 추가하려는 모든 속성을 정의하십시오.

    참고 : Rails의 테이블 이름은 항상 복수형입니다 (DB 규칙과 일치). 앞에서 언급 한 단계 중 하나를 사용하는 예

    rails generate migration addEmailToUsers

  2. rake db:migrate

또는

  1. db/schema.rbSQL 쿼리에서 원하는 열 추가 에서에서 스키마를 변경할 수 있습니다 .
  2. 이 명령을 실행하십시오 : rake db:schema:load

    경고 /주의

    실행하면 rake db:schema:load테이블의 모든 데이터가 자동으로 지워집니다.


이 작업을 수행했지만 "비계"를 다시 실행하고 새 열을 추가하지 않았습니다. "자동으로"어떻게 할 수 있습니까?
John Wooten

@John Wooten, 스캐 폴드를 삭제하고 다시 진행하고 싶을 수도 있습니다. 해당 마이그레이션도 삭제하십시오.
Afolabi Olaoluwa Akinwumi

참고 사항 추가 : 마이그레이션을 변경하지 않고 스키마를 변경하면 앱을 유지 관리하는 다른 개발자에게 문제가 발생할 수 있습니다.
BKSpurgeon

3

이 작업을 수행하면 원래 마이그레이션을 처리하지 않고 위쪽 섹션의 추가 열과 아래쪽 섹션의 드롭 열만 사용하여 새 마이그레이션을 만듭니다.

원본을 변경 한 후 다시 마이그레이션하면 다시 실행할 수 있지만이 경우에는 제대로 작동하지 않는 마이그레이션이 만들어진 것 같습니다.

현재 게시 된 것처럼 열을 추가 한 다음 테이블을 만듭니다.

순서를 변경하면 작동 할 수 있습니다. 또는 기존 마이그레이션을 수정하면서 별도의 추가 열을 수행하는 대신 작성 테이블에 추가하십시오.


1

force: true테이블이 이미있는 경우을 사용하여 테이블의 테이블 열을 강제로 실행할 수도 있습니다.

:

ActiveRecord::Schema.define(version: 20080906171750) do
  create_table "authors", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
end

1

새 열을 추가하기 위해 마이그레이션에서 특별한 change_table 메소드를 사용할 수도 있습니다 .

change_table(:users) do |t|
  t.column :email, :string
end

0

마지막 마이그레이션을 롤백 할 수 있습니다.

rake db:rollback STEP=1

또는이 특정 마이그레이션을 롤백

rake db:migrate:down VERSION=<YYYYMMDDHHMMSS>

파일을 편집 한 다음 rake db:mirgate다시 실행 하십시오.



0

다음과 같이 before column 또는 after column을 사용하여 특정 위치에 열을 추가 할 수도 있습니다.

rails generate migration add_dob_to_customer dob:date

마이그레이션 파일은 다음을 제외하고 다음 코드를 생성합니다. : email. : email 또는 before : : email 다음에 추가해야합니다.

class AddDobToCustomer < ActiveRecord::Migration[5.2]
  def change
    add_column :customers, :dob, :date, after: :email
  end
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.