我需要使用 RAILS 迁移更新数据库中的表数据。
Sample:
Table: Table_A(Col_A(number), Col_B(varchar),...)
Query: UPDATE Table_A SET Col_B = "XXX" where Col_B = "YYY"
使用 RAILS Migrations 执行此操作的最佳方法是什么。我什至不确定 RAILS 迁移是否是更新数据库中数据的方法。任何解释都会有所帮助。
我需要使用 RAILS 迁移更新数据库中的表数据。
Sample:
Table: Table_A(Col_A(number), Col_B(varchar),...)
Query: UPDATE Table_A SET Col_B = "XXX" where Col_B = "YYY"
使用 RAILS Migrations 执行此操作的最佳方法是什么。我什至不确定 RAILS 迁移是否是更新数据库中数据的方法。任何解释都会有所帮助。
通常最好在 rake 任务中进行此类大数据更新。我通常编写它们,因此它们有两个版本:rake change_lots_of_data:report 和 rake change_lots_of_data:update。'report' 版本只是执行 where 子句并输出将要更改的内容的列表。“更新”版本使用相同的 where 子句,但进行了更改。
这样做的一些优点是:
我更喜欢在 rake 任务中进行任何数据库数据更改,这样就可以了
rake db:migrate
编码:
namespace :update do
desc "Update table A to set Col_B to YYY"
task :table_a => :environment do
TableA.where(Col_B: "YYY").update_all(Col_B: "XXX")
end
end
end
然后您可以rake update:table_a
执行更新。
这应该在 rake 任务中完成......
namespace :onetime do
task :update_my_data => :environment do
TableA.where(Col_B: "YYY").update_all(Col_B: "XXX")
end
end
然后在你部署之后:
rake onetime:update_my_data
在我的公司,我们删除了一次性命名空间 rake 任务在生产中运行后的内容。我猜对我们来说只是一个约定。
update_all
有关该方法 的更多详细信息:http: //apidock.com/rails/ActiveRecord/Relation/update_all
你可以这样做:
class YourMigration < ActiveRecord::Migration
def up
execute('UPDATE Table_A SET Col_B = "XXX" where Col_B = "YYY"')
end
def down
end
end
或者:
class YourMigration < ActiveRecord::Migration
def up
update('UPDATE Table_A SET Col_B = "XXX" where Col_B = "YYY"')
end
def down
end
end
ActiveRecord::Base.connection.execute("update Table_A set Col_B = 'XXX' where Col_B = 'YYY')