ruby-on-rails - name - ruby on rails migrate




Ruby on Rails 마이그레이션에서 데이터베이스 컬럼의 이름을 바꾸려면 어떻게해야합니까? (17)

API에서 :

rename_column(table_name, column_name, new_column_name)

그것은 열의 이름을 바꾸지 만 유형과 내용은 동일하게 유지합니다.

나는 hased_password 대신에 hashed_password 컬럼을 잘못 명명했다.

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


IMO,이 경우 rake db:rollback 사용하는 것이 좋습니다. 그런 다음 마이그레이션을 편집하고 rake db:migrate 다시 입력하십시오. 그러나 잃고 싶지 않은 열에 데이터가 있으면 rename_column 을 사용 rename_column .


Ruby on Rails 콘솔을 열고 다음을 입력하십시오 :

ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column

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 - Migrations 또는 Active Record Migrations로 이동하십시오 .


또 다른 대안으로 이주의 아이디어에 결혼하지 않았다면 자동으로 이름 변경을 처리하는 ActiveRecord에 대한 매력적인 보석 인 Datamapper 스타일이 있습니다. 모델에서 열 이름을 변경하면됩니다 ( Model.auto_upgrade!model.rb 의 맨 아래에 두십시오). 그리고 viola! 데이터베이스는 즉시 업데이트됩니다.

https://github.com/DAddYE/mini_record

참고 : 충돌을 방지하려면 db / schema.rb 를 수정해야합니다.

아직 베타 단계에 있지만 분명히 모든 사람이 아니지만 여전히 매력적인 선택입니다. (현재 문제가없는 두 가지 간단한 제작 응용 프로그램에서 사용하고 있습니다)


루비 온 레일즈 4 :

def change
    rename_column :table_name, :column_name_old, :column_name_new
end

새 마이그레이션을 작성하기 만하면 다음과 같이 rename_column 을 블록으로 사용 rename_column .

rename_column :your_table_name, :hased_password, :hashed_password

수동으로 우리는 아래의 방법을 사용할 수 있습니다 :

다음과 같이 수동으로 이전을 수정할 수 있습니다.

  • app/db/migrate/xxxxxxxxx_migration_file.rb 엽니 다.

  • hased_passwordhashed_password 업데이트 hased_password

  • 아래 명령을 실행하십시오.

    $> rake db:migrate:down VERSION=xxxxxxxxx
    

그런 다음 이전을 제거합니다.

$> rake db:migrate:up VERSION=xxxxxxxxx

업데이트 된 변경 사항이있는 마이그레이션이 추가됩니다.


열 이름을 전환해야하는 경우 중복 된 열 이름 오류 를 피하기 위해 자리 표시자를 만들어야합니다. 다음은 그 예입니다.

class SwitchColumns < ActiveRecord::Migration
  def change
    rename_column :column_name, :x, :holder
    rename_column :column_name, :y, :x
    rename_column :column_name, :holder, :y
  end
end

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

먼저 새 이름으로 열을 추가하고 이전 열 이름의 값으로 채우기 위해 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 백그라운드에서 bundle exec rake db:migrate 를 실행하십시오.

이 과정에 조금 더 관련이 있다는 것을 알고 있지만, 제 제작 마이그레이션과 관련된 문제보다 오히려이 작업을 수행하고 싶습니다.


코드가 다른 것과 공유되지 않는다면 가장 좋은 방법은 rake db:rollback 한 다음 마이그레이션에서 열 이름을 편집하고 rake db:migrate 를 편집 rake db:migrate 입니다. 그게 전부 야.

그리고 다른 이주를 작성하여 컬럼 이름을 바꿀 수 있습니다

 def change
    rename_column :table_name, :old_name, :new_name
  end

그게 전부 야.


현재 데이터가 중요하지 않은 경우 다음을 사용하여 원래 마이그레이션을 중단 할 수 있습니다.

rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'

따옴표가 없으면 원래 마이그레이션을 변경하고 다음과 같이하여 위로 마이그레이션을 다시 실행하십시오.

rake db:migrate

rails g migration ChangesNameInUsers (또는 이름을 rails g migration ChangesNameInUsers 싶다)를 실행한다.

방금 생성 된 마이그레이션 파일을 def change 행을 메서드에 추가합니다 ( def changeend 사이).

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

파일을 저장하고 콘솔에서 rake db:migrate 를 실행 rake db:migrate

이름이 데이터베이스에서 실제로 변경되었는지 확인하려면 schema.db 를 확인하십시오!

희망이 도움이 :)


Ruby on Rails 마이그레이션 생성 :

$:> rails g migration Fixcolumnname

마이그레이션 파일 (XXXXXfixcolumnname.rb)에 코드 삽입 :

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

업데이트 - create_table의 가까운 사촌은 change_table이며 기존 테이블을 변경하는 데 사용됩니다. create_table과 비슷한 방식으로 사용되지만 블록에 부여 된 객체는 더 많은 트릭을 알고 있습니다. 예 :

class ChangeBadColumnNames < ActiveRecord::Migration
  def change
    change_table :your_table_name do |t|
      t.rename :old_column_name, :new_column_name
    end
  end
end

이 방법은 다음과 같은 다른 변경 방법을 사용하는 경우보다 효율적입니다. 인덱스 제거 / 추가 제거 / 열 추가, 예를 들어 다음과 같이 할 수 있습니다.

# Rename
t.rename :old_column_name, :new_column_name
# Add column
t.string :new_column
# Remove column
t.remove :removing_column
# Index column
t.index :indexing_column
#...

 def change
    rename_column :table_name, :old_column_name, :new_column_name
  end

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 업데이트

그러나 down 방법은 여전히 ​​적용됩니다. 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

주제를 제기 한 Luke & Turadg 에게 감사드립니다.

그럼 그냥 db:migratedb:migrate 평소처럼 또는 그러나 당신은 당신의 사업에 대해 이동하십시오.

Rails 4 업데이트

열 이름 바꾸기와 같이 Migration 을 생성하는 동안 Rails 4는 위의 대답에서 언급 한 것처럼 위와 down 대신 change 방법을 생성합니다. 생성 된 change 방법은 다음과 같습니다.

$ > rails g migration ChangeColumnName

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

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




migration