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 '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
# 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
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 或者你开始做生意 .
An update for 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
class ChangeBadColumnNames < ActiveRecord::Migration
def change
change_table :your_table_name do |t|
t.rename :old_column_name, :new_column_name
end
end
end
如果我们使用其他alter方法,例如:remove / add index / remove index / add column,这种方式会更有效,例如我们可以做更多的事情:
25 回答
只需使用命令生成迁移
在编辑之后,迁移在change方法中添加以下行
这应该可以解决问题 .
Generate a Ruby on Rails migration :
Insert code in the migration file (XXXXXfixcolumnname.rb) :
我在rails 5.2上,并试图在设备用户上重命名列 .
rename_column
位对我有用,但单数:table_name
引发了"User table not found"错误 . 多元为我工作 .然后将迁移文件更改为:
哪里:代理?是旧的列名称 .
Generate the migration file:
# Creates db/migrate/xxxxxxxxxx.rb
Edit the migration to do your will.
您有两种方法可以做到这一点:
rake db:migrate
时运行up方法并在rake db:rollback
时运行down方法:http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
根据
Available Transformations
rename_column(table_name, column_name, new_column_name):
重命名列但保留类型和内容 .
Rails 5迁移更改
例如:
如果你想将 student_name 列更改为 name
注意: - 如果你没有运行 rails db:migrate
您可以执行以下步骤
这将删除生成的迁移文件,现在您可以更正列名称
如果迁移(rails db:migrate),请使用以下选项更改列名
来自API:
它重命名列但保持类型和内容保持不变 .
如果您的代码未与其他代码共享,那么最好的选择就是
rake db:rollback
然后在迁移中编辑您的列名称rake db:migrate
. 而已您可以编写另一个迁移来重命名该列
而已 .
作为替代选择,如果您没有与迁移的想法结合,那么ActiveRecord有一个引人注目的宝石,它将自动为您处理名称更改,Datamapper样式 . 您所做的只是更改模型中的列名称(并确保将 Model.auto_upgrade! 放在model.rb的底部)和中提琴!数据库即时更新 .
https://github.com/DAddYE/mini_record
注意:您需要核实 db/schema.rb 以防止冲突
仍然处于测试阶段,显然不适合所有人,但仍然是一个引人注目的选择(我目前在两个非平凡的 生产环境 应用程序中使用它没有问题)
我们可以手动使用以下方法:
我们可以手动编辑迁移,如:
打开
app/db/migrate/xxxxxxxxx_migration_file.rb
更新
hased_password
至hashed_password
运行以下命令
然后它将删除您的迁移:
它将使用更新的更改添加您的迁移 .
运行
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
,以查看数据库中的名称是否已实际更改!希望这可以帮助 :)
对于Ruby on Rails 4:
如果该列已经填充了数据并且正在 生产环境 中,我建议采用一步一步的方法,以避免在等待迁移时停止 生产环境 .
首先,我创建一个db迁移来添加具有新名称的列,并使用旧列名中的值填充它们 .
然后,我将承诺改变,并将改变推向 生产环境 .
然后,一旦提交投入 生产环境 ,我就会运行 .
然后我将所有引用旧列名的视图/控制器更新为新列名 . 运行我的测试套件,并提交这些更改 . (确保它在本地工作并首先通过所有测试!)
然后我会把这个提交推向 生产环境 .
此时,您可以删除原始列,而无需担心与迁移本身相关的任何类型的停机时间 .
然后将此最新迁移推送到 生产环境 并在后台运行
bundle exec rake db:migrate
.我意识到这涉及到一个过程,但我更愿意这样做,而不是 生产环境 迁移的问题 .
打开该迁移文件并修改该文件,如下所示(输入原始文件
table_name
)打开Ruby on Rails控制台并输入:
运行以下命令以创建迁移文件:
然后在
db/migrate
文件夹中生成的文件中,写下rename_column
,如下所示:Update:
您可能希望创建单独的迁移来执行此操作 . (重命名FixColumnName就像你一样将)
然后编辑迁移以执行您的意愿 .
An update for Rails 3.1
虽然,
up
和down
方法仍然适用 . Rails 3.1收到一个change
方法"knows how to migrate your database and reverse it when the migration is rolled back without the need to write a separate down method"如果您碰巧有一大堆要重命名的列,或者需要一遍又一遍地重复表名的内容 .
您可以使用
change_table
来保持整洁 .谢谢你,
Luke
&&Turadg
,提出这个话题 .然后像往常一样
db:migrate
或者你开始做生意 .An update for Rails 4
在创建
Migration
和重命名列时,Rails 4生成change
方法而不是up
和down
,如上面的答案中所述 . 生成的change
方法如下:这将创建一个类似于此的迁移文件:
只需创建一个新的迁移,并在一个块中,使用
rename_column
,如下所示 .IMO,在这种情况下,更好地使用
rake db:rollback
. 然后编辑您的迁移并再次输入rake db:migrate
. 但是,如果列中有数据,则不想丢失,请使用rename_column
.如果需要切换列名,则需要创建占位符以避免 duplicate column name error . 这是一个例子:
Update - create_table的近亲是change_table,用于更改现有表 . 它以与create_table类似的方式使用,但产生块的对象知道更多技巧 . 例如:
如果我们使用其他alter方法,例如:remove / add index / remove index / add column,这种方式会更有效,例如我们可以做更多的事情:
某些版本的Ruby on Rails支持向上/向下迁移方法,如果在迁移中有up / down方法,则:
如果您在迁移中使用了
change
方法,那么:有关更多信息,您可以移动:Ruby on Rails - Migrations或Active Record Migrations .
如果当前数据对您不重要,您可以使用以下命令删除原始迁移:
如果没有引号,则在原始迁移中进行更改,然后通过以下方式再次运行向上迁移: