Вопрос: Как я могу переименовать столбец базы данных в миграции Ruby on Rails?


Я ошибочно назвал столбец hased_passwordвместо hashed_password,

Как обновить схему базы данных, используя миграцию, чтобы переименовать этот столбец?


1266


источник


Ответы:


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

В то время upа также 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:migrateкак обычно, или же вы занимаетесь своим бизнесом.


Обновление для Rails 4

При создании Migrationкак для переименования столбца, Rails 4 генерирует changeвместо upа также downкак указано в приведенном выше ответе. Сгенерированный changeметод выглядит следующим образом:

$ > rails g migration ChangeColumnName

который создаст файл миграции, подобный этому:

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

2060



ИМО, в этом случае, лучше использовать rake db:rollback, Затем отредактируйте свою миграцию и снова введите rake db:migrate, Однако, если у вас есть данные в столбце, который вы не хотите потерять, используйте rename_column,


63



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

Под Available Transformations

rename_column(table_name, column_name, new_column_name):

Переименовывает столбец, но сохраняет тип и содержимое.


26



Если столбец уже заполнен данными и живет в процессе производства, я бы рекомендовал поэтапный подход, чтобы избежать простоев в производстве, ожидая миграции.

Сначала я создал миграцию 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на заднем фоне.

Я понимаю, что это немного больше связано с процессом, но я предпочел бы сделать это, чем проблемы с моей производственной миграцией.


24



Run the below command to create a migration file:

rails g migration ChangeHasedPasswordToHashedPassword

Then in the file generated in the db/migrate folder, write rename_column as below:

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

16



From API:

rename_column(table_name, column_name, new_column_name)

It renames a column but keeps the type and content remains same.


13



Some versions of Ruby on Rails support to up/down method to migration and if you have up/down method in your migration, then:

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

If you have the change method in your migration, then:

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

For more information you can move: Ruby on Rails - Migrations or Active Record Migrations.


12



If your code is not shared with other one, then best option is to do just rake db:rollback then edit your column name in migration and rake db:migrate. Thats it

And you can write another migration to rename the column

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

Thats it.


10



If you need to switch column names you will need to create a placeholder to avoid a duplicate column name error. Here's an example:

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

8