How can I rename a database column in a Ruby on Ra

2019-01-03 00:24发布

I wrongly named a column hased_password instead of hashed_password.

How do I update the database schema, using migration to rename this column?

25条回答
戒情不戒烟
2楼-- · 2019-01-03 01:01

Manually we can use the below method:

We can edit the migration manually like:

  • Open app/db/migrate/xxxxxxxxx_migration_file.rb

  • Update hased_password to hashed_password

  • Run the below command

    $> rake db:migrate:down VERSION=xxxxxxxxx
    

Then it will remove your migration:

$> rake db:migrate:up VERSION=xxxxxxxxx

It will add your migration with the updated change.

查看更多
太酷不给撩
3楼-- · 2019-01-03 01:05

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

Under Available Transformations

rename_column(table_name, column_name, new_column_name):

Renames a column but keeps the type and content.

查看更多
一夜七次
4楼-- · 2019-01-03 01:06

If the column is already populated with data and live in production, I'd recommend a step by step approach, so as to avoid downtime in production while waiting for the migrations.

First I'd create a db migration to add columns with the new name(s) and populate them with the values from the old column name.

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

Then I'd commit just that change, and push the change into production.

git commit -m 'adding columns with correct name'

Then once the commit has been pushed into production, I'd run.

Production $ bundle exec rake db:migrate

Then I'd update all of the views/controllers that referenced the old column name to the new column name. Run through my test suite, and commit just those changes. (After making sure it was working locally and passing all tests first!)

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

Then I'd push that commit to production.

At this point you can remove the original column without worrying about any sort of downtime associated with the migration itself.

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

Then push this latest migration to production and run bundle exec rake db:migrate in the background.

I realize this is a bit more involved of a process, but I'd rather do this than have issues with my production migration.

查看更多
时光不老,我们不散
5楼-- · 2019-01-03 01:06
$:  rails g migration RenameHashedPasswordColumn
invoke  active_record
      create    db/migrate/20160323054656_rename_hashed_password_column.rb

Open that migration file and modify that file as below(Do enter your original table_name)

class  RenameHashedPasswordColumn < ActiveRecord::Migration
  def change
    rename_column :table_name, :hased_password, :hashed_password
  end
end
查看更多
小情绪 Triste *
6楼-- · 2019-01-03 01:06

Generate a Ruby on Rails migration:

$:> rails g migration Fixcolumnname

Insert code in the migration file (XXXXXfixcolumnname.rb):

class Fixcolumnname < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end
查看更多
Deceive 欺骗
7楼-- · 2019-01-03 01:07

IMO, in this case, better use rake db:rollback. Then edit your migration and again type rake db:migrate. However, if you have data in the column you don't want to lose, then use rename_column.

查看更多
登录 后发表回答