[ruby-on-rails] Ruby on Rails 마이그레이션에서 데이터베이스 열의 이름을 바꾸려면 어떻게해야합니까?

hased_password대신 열 이름을 잘못 지정했습니다 hashed_password.

마이그레이션을 사용하여이 열의 이름을 바꾸면 데이터베이스 스키마를 어떻게 업데이트합니까?



답변

rename_column :table, :old_column, :new_column

이를 위해 별도의 마이그레이션을 만들고 싶을 것입니다. (원하는대로 이름을 바꾸십시오 FixColumnName.) :

script/generate migration FixColumnName
# creates  db/migrate/xxxxxxxxxx_fix_column_name.rb

그런 다음 원하는대로 마이그레이션을 편집하십시오.

# db/migrate/xxxxxxxxxx_fix_column_name.rb
class FixColumnName < ActiveRecord::Migration
  def self.up
    rename_column :table_name, :old_column, :new_column
  end

  def self.down
    # rename back if you need or do something else or do nothing
  end
end

Rails 3.1의 경우 :

updown방법이 여전히 적용 되는 동안 Rails 3.1은 change“데이터베이스를 마이그레이션하는 방법을 알고 별도의 다운 방법을 작성할 필요없이 마이그레이션이 롤백 될 때 데이터베이스를 되 돌리는 방법”을받습니다.

자세한 내용은 ” 활성 레코드 마이그레이션 “을 참조하십시오.

rails g migration FixColumnName

class FixColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

이름을 변경하기 위해 전체 열 묶음이 있거나 테이블 이름을 반복해서 반복 해야하는 경우 :

rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...

change_table물건을 조금 더 깔끔하게 유지 하는 데 사용할 수 있습니다 .

class FixColumnNames < ActiveRecord::Migration
  def change
    change_table :table_name do |t|
      t.rename :old_column1, :new_column1
      t.rename :old_column2, :new_column2
      ...
    end
  end
end

그런 다음 db:migrate평소와 같이 또는 비즈니스를 진행합니다.


레일 4의 경우 :

을 만드는 동안 Migration열을 바꾸기 위해, (4)는 생성 레일 change대신 방법 updown상기 섹션에 언급 한 바와 같이. 생성 된 change방법은 다음과 같습니다.

$ > rails g migration ChangeColumnName

다음과 유사한 마이그레이션 파일이 생성됩니다.

class ChangeColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end


답변

내 생각에,이 경우에는을 사용 rake db:rollback하고 마이그레이션을 편집하고 다시 실행하는 것이 rake db:migrate좋습니다.

그러나 열에 데이터를 잃고 싶지 않은 경우을 사용하십시오 rename_column.


답변

열이 이미 데이터로 채워져 있고 프로덕션 환경에있는 경우 마이그레이션을 기다리는 동안 프로덕션에서 다운 타임을 피하기 위해 단계별 접근 방식을 권장합니다.

먼저 새로운 이름으로 열을 추가하고 이전 열 이름의 값으로 채울 수 있도록 db 마이그레이션을 만듭니다.

class AddCorrectColumnNames < ActiveRecord::Migration
  def up
    add_column :table, :correct_name_column_one, :string
    add_column :table, :correct_name_column_two, :string

    puts 'Updating correctly named columns'
    execute "UPDATE table_name SET correct_name_column_one = old_name_column_one, correct_name_column_two = old_name_column_two"
    end
  end

  def down
    remove_column :table, :correct_name_column_one
    remove_column :table, :correct_name_column_two
  end
end

그런 다음 그 변경 사항을 커밋하고 변경 사항을 프로덕션에 적용합니다.

git commit -m 'adding columns with correct name'

그런 다음 커밋이 프로덕션으로 푸시되면 실행됩니다.

Production $ bundle exec rake db:migrate

그런 다음 이전 열 이름을 참조한 모든보기 / 컨트롤러를 새 열 이름으로 업데이트했습니다. 내 테스트 스위트를 실행하고 변경 사항을 커밋하십시오. (로컬에서 작동하고 모든 테스트를 먼저 통과했는지 확인한 후!)

git commit -m 'using correct column name instead of old stinky bad column name'

그런 다음 그 커밋을 프로덕션에 푸시합니다.

이 시점에서 마이그레이션 자체와 관련된 모든 종류의 다운 타임에 대한 걱정없이 원본 열을 제거 할 수 있습니다.

class RemoveBadColumnNames < ActiveRecord::Migration
  def up
    remove_column :table, :old_name_column_one
    remove_column :table, :old_name_column_two
  end

  def down
    add_column :table, :old_name_column_one, :string
    add_column :table, :old_name_column_two, :string
  end
end

그런 다음이 최신 마이그레이션을 프로덕션으로 푸시 bundle exec rake db:migrate하고 백그라운드에서 실행 하십시오.

나는 이것이 프로세스에 조금 더 관여한다는 것을 알고 있지만 프로덕션 마이그레이션에 문제가있는 것보다 오히려이 작업을 수행하고 싶습니다.


답변

http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

아래에 Available Transformations

rename_column(table_name, column_name, new_column_name):

열의 이름을 바꾸지 만 유형과 내용은 유지합니다.


답변

아래 명령을 실행하여 마이그레이션 파일을 작성하십시오.

rails g migration ChangeHasedPasswordToHashedPassword

그런 다음 db/migrate폴더에 생성 된 파일에 다음과 같이 작성하십시오 rename_column.

class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
  def change
     rename_column :table_name, :hased_password, :hashed_password
  end
end


답변

API에서 :

rename_column(table_name, column_name, new_column_name)

열 이름은 바뀌지 만 유형과 내용은 동일하게 유지됩니다.


답변

일부 버전의 Ruby on Rails는 업 / 다운 방법으로 마이그레이션을 지원하며, 마이그레이션에 업 / 다운 방법이 있으면 다음을 수행하십시오.

def up
    rename_column :table_name, :column_old_name, :column_new_name
end

def down
    rename_column :table_name, :column_new_name, :column_old_name
end

당신이있는 경우 change마이그레이션에 방법을, 다음 :

def change
    rename_column :table_name, :column_old_name, :column_new_name
end

자세한 정보는 Ruby on Rails-마이그레이션 또는 활성 레코드 마이그레이션으로 이동할 수 있습니다 .