3

我需要使用 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 迁移是否是更新数据库中数据的方法。任何解释都会有所帮助。

4

5 回答 5

5

通常最好在 rake 任务中进行此类大数据更新。我通常编写它们,因此它们有两个版本:rake change_lots_of_data:report 和 rake change_lots_of_data:update。'report' 版本只是执行 where 子句并输出将要更改的内容的列表。“更新”版本使用相同的 where 子句,但进行了更改。

这样做的一些优点是:

  • 保存迁移以更改数据库结构
  • 您可以随时运行“报告”版本,以确保更新正确的记录。
  • 对 rake 任务调用的类进行单元测试更容易。
  • 如果您需要应用相同的条件再次进行更改,您可以再次运行 rake 任务。通过迁移来做到这一点是可能的,但更棘手。
于 2013-03-20T18:26:04.373 回答
5

我更喜欢在 rake 任务中进行任何数据库数据更改,这样就可以了

  1. 明显的
  2. 可重复
  3. 以后不会通过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执行更新。

于 2013-03-20T18:28:26.870 回答
4

这应该在 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

于 2013-03-20T18:13:20.133 回答
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
于 2013-03-20T18:03:21.467 回答
0
ActiveRecord::Base.connection.execute("update Table_A set Col_B = 'XXX'  where Col_B = 'YYY')
于 2013-03-20T18:03:00.417 回答