我错误地将列命名为hased_password而不是hashed_password。
如何使用迁移重命名此列来更新数据库架构?
我错误地将列命名为hased_password而不是hashed_password。
如何使用迁移重命名此列来更新数据库架构?
当前回答
如果该列中已经填充了数据并在生产环境中运行,我建议采用一步一步的方法,以便在等待迁移时避免生产环境中的停机。
首先,我将创建一个数据库迁移,以添加具有新名称的列,并用旧列名的值填充它们。
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。
我意识到这是一个更复杂的过程,但我宁愿这样做,也不想在生产迁移中遇到问题。
其他回答
如果当前数据对您不重要,您可以使用以下方法删除原始迁移:
rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'
如果没有引号,请在原始迁移中进行更改,然后通过以下方式再次运行升级迁移:
rake db:migrate
def change
rename_column :table_name, :old_column_name, :new_column_name
end
请参阅“活动记录迁移”文档中的“可用转换”部分。
rename_column(table_name, column_name, new_column_name):
重命名列,但保留类型和内容。
您可以编写迁移,运行以下命令以更新列名:
rename_column :your_table_name, :hased_password, :hashed_password
此外,确保用新列名更新代码中旧列名的任何用法。
我在使用PostgreSQL数据库开发Rails 6应用程序时遇到了这个挑战。
以下是我修复它的方法:
在我的例子中,table_name是“Products”,old_column是“SKU”,new_column则是“ProductNumber”。
创建包含用于重命名列的命令的迁移文件:rails生成迁移重命名KUToProductNumberInProducts打开db/migrate目录中的迁移文件:数据库/migrate/2021028082344_rename_sku_to_product_number_in_products.rb添加用于重命名列的命令:类RenameKuToProductNumberInProducts<ActiveRecord::迁移[6.0]def更改#重命名列:表名,:旧列,:新列重命名列:产品,:sku,:product_number终止终止保存,然后运行迁移命令:轨道数据库:移植
现在,您可以通过查看架构文件来确认列的重命名:
db/schema.rb
如果您对列的重命名不满意,可以始终回滚:
rails db:rollback
注意:在调用列名的所有位置,努力将列名修改为新名称。