我如何重命名Ruby on Rails迁移中的数据库列?

我错误地命名了一列hased_password而不是hashed_password

如何更新数据库模式,使用迁移来重命名此列?

 rename_column :table, :old_column, :new_column 

更新:

你可能会想创build一个单独的迁移来做到这一点。 (你将会重命名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方法, “知道如何迁移你的数据库,并在迁移回滚时反转,而不需要编写一个单独的down方法”

 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 

感谢LukeTuradg提出这个话题。

然后只是db:migrate像往常一样db:migrate ,或者你去做你的生意。


Rails 4的更新

在为重命名列创buildMigration同时,Rails 4生成了一个change方法,而不是像上面的答案中提到的那样updown 。 生成的change方法如下所示:

 $ > rails g migration ChangeColumnName 

这将创build一个类似于此的迁移文件:

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

国际海事组织,在这种情况下,更好地使用rake db:rollback 。 然后编辑你的迁移,然后再inputrake db:migrate 。 但是,如果列中的数据不想丢失,请使用rename_column

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

Available Transformations

rename_column(table_name, column_name, new_column_name):

重命名列,但保留types和内容。

如果该列已经填充了数据并且正在生产中,我build议采取一步一步的方法,以避免等待迁移时的停产。

首先,我将创build一个数据库迁移来添加具有新名称的列,并使用旧列名称中的值填充它们。

 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 

然后我会更新所有引用旧列名称的视图/控制器到新的列名称。 运行我的testing套件,并只提交这些更改。 (确保它在本地工作并首先通过所有testing!)

 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

我意识到这是一个更复杂的过程,但我宁愿这样做比我的生产迁移有问题。

运行以下命令来创build迁移文件:

 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) 

它重命名一列,但保持types和内容保持不变。

某些版本的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 – 迁移活动logging迁移

如果你的代码不与其他人共享,那么最好的select就是做rake db:rollback然后在migration中编辑你的列名,使用rake db:migrate 。 而已

而且您可以编写另一个迁移来重命名该列

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

而已。

如果您需要切换列名,您将需要创build一个占位符以避免重复的列名错误 。 这是一个例子:

 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 

作为一种替代select,如果您没有结合迁移的想法,那么ActiveRecord就有一个引人注目的gem,它将自动为您处理名称更改,Datamapper样式。 你所要做的只是改变模型中的列名(确保你把Model.auto_upgrade!放在你的model.rb的底部)和中提琴! 数据库即时更新。

https://github.com/DAddYE/mini_record

注意:您将需要核实db / schema.rb以防止冲突

仍然处于testing阶段,显然不是每个人,但仍然是一个引人注目的select(我目前正在使用它在两个不平凡的生产应用程序没有问题)

只需创build一个新的迁移,并在一个块中,使用rename_column如下。

 rename_column :your_table_name, :hased_password, :hashed_password 

对于Ruby on Rails 4:

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

如果目前的数据对您不重要,您可以使用以下命令取消原始迁移:

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

如果没有引号,请在原始迁移中进行更改,并通过以下方式再次运行迁移:

 rake db:migrate 

手动我们可以使用下面的方法:

我们可以手动编辑迁移,如下所示:

  • 打开app/db/migrate/xxxxxxxxx_migration_file.rb

  • hased_password更新为hashed_password

  • 运行下面的命令

     $> rake db:migrate:down VERSION=xxxxxxxxx 

然后它会删除你的迁移:

 $> rake db:migrate:up VERSION=xxxxxxxxx 

它将添加您的迁移与更新的更改。

运行rails g migration ChangesNameInUsers (或任何你想命名它)

打开刚刚生成的迁移文件,并在方法中添加此行(在def changeend之间):

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

保存该文件,然后在控制台中运行rake db:migrate

检查你的schema.db为了查看数据库中的名字是否真的改变了!

希望这可以帮助 :)

生成迁移文件:

 rails g migration FixName 

#创builddb / migrate / xxxxxxxxxx.rb

编辑迁移以完成您的愿望。

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

生成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 
 $: rails g migration RenameHashedPasswordColumn invoke active_record create db/migrate/20160323054656_rename_hashed_password_column.rb 

打开该迁移文件并修改该文件(请input您的原始表名)

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

打开你的Ruby on Rails控制台并input:

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

你有两种方法来做到这一点:

  1. 在这种types中,它在回滚时自动运行它的反向代码。

     def change rename_column :table_name, :old_column_name, :new_column_name end 
  2. 对于这种types,当rake db:migrate运行up方法时rake db:migrate并运行rake db:rollback时的down方法rake db:rollback

     def self.up rename_column :table_name, :old_column_name, :new_column_name end def self.down rename_column :table_name,:new_column_name,:old_column_name end 
  def change rename_column :table_name, :old_column_name, :new_column_name end 

只需使用命令生成迁移

 rails g migration rename_hased_password 

之后,编辑迁移添加以下行中的更改方法

 rename_column :table, :hased_password, :hashed_password 

这应该做的伎俩。

更新 – 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 #...