我如何重命名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
感谢Luke
& Turadg
提出这个话题。
然后只是db:migrate
像往常一样db:migrate
,或者你去做你的生意。
Rails 4的更新
在为重命名列创buildMigration
同时,Rails 4生成了一个change
方法,而不是像上面的答案中提到的那样up
和down
。 生成的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 change
和end
之间):
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
你有两种方法来做到这一点:
-
在这种types中,它在回滚时自动运行它的反向代码。
def change rename_column :table_name, :old_column_name, :new_column_name end
-
对于这种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 #...