我需要使用RAILS迁移更新数据库中的表数据。
Sample:
Table: Table_A(Col_A(number), Col_B(varchar),...)
Query: UPDATE Table_A SET Col_B = "XXX" where Col_B = "YYY"
使用RAILS迁移执行此操作的最佳方法是什么。我甚至不确定RAILS迁移是否是更新数据库中数据的方法。任何解释都会有所帮助。
答案 0 :(得分:3)
通常,在rake任务中执行这些类型的大数据更新会更好。我经常写它们,因此它们有两个版本:rake change_lots_of_data:report和rake change_lots_of_data:update。 'report'版本只执行where子句并吐出一个可以更改的列表。 “更新”版本使用完全相同的where子句但进行更改。
这样做的一些好处是:
答案 1 :(得分:2)
这应该在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
答案 2 :(得分:2)
我更喜欢在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
执行更新。
答案 3 :(得分:1)
你可以这样做:
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
答案 4 :(得分:0)
ActiveRecord::Base.connection.execute("update Table_A set Col_B = 'XXX' where Col_B = 'YYY')