【问题标题】:fetch data from one table and insert then into another table Mysql, Sidekiq, Ruby从一个表中获取数据,然后插入到另一个表 Mysql、Sidekiq、Ruby
【发布时间】:2015-08-04 00:04:47
【问题描述】:

我们必须从一个表中获取大约 500 万条记录,并将它们插入到另一个具有相同表结构的表中。

我们正在使用Sidekiq和redis将要插入的记录放入队列并从队列中插入。

这是我的代码: User_controller

def reinsert_users    
   @active_users = ExportUser.all
   RecreateUserWorker.perform_async(@active_users)
end

recreateuser_worker.rb

class RecreateUserWorker
  include Sidekiq::Worker

  def perform(users)
    begin     
      @user = User.new("true")
      @user.recreate(users)
    rescue
      raise
    end
  end

end

'''''

User.rb :

def recreate(users)
    users.each do |user|
      @user = ExportUsersV2.new(user)  # new table to insert
      @user.save     
    end
end

这是我得到的错误:

WARN: {"class"=>"RecreateUserWorker", "args"=>["#<ExportUser::ActiveRecord_Relation:0xa3781b0>"], "retry"=>true, "queue"=>"default", "jid"=>"25fe4378de1bb967ff4d1e5e", "enqueued_at"=>1438605202.8414373, "error_message"=>"undefined method `each' for \"#<ExportUser::ActiveRecord_Relation:0xa3781b0>\":String", "error_class"=>"NoMethodError", "failed_at"=>1438605202.8470101, "retry_count"=>0}

我在这里错过了什么??

【问题讨论】:

    标签: ruby-on-rails sinatra sidekiq


    【解决方案1】:

    您正在传入一个复杂的 Ruby 对象,这是不允许的。

    https://github.com/mperham/sidekiq/wiki/Best-Practices#1-make-your-job-parameters-small-and-simple

    【讨论】:

      【解决方案2】:

      我认为最好使用直接 mysql 查询批量插入用户。

      您可以为此使用 gem https://github.com/tauqeer-ahmad/bulk_uploadable/tree/master 或任何其他 gem。

      我认为这可以解决这个问题。

      【讨论】:

      • bulk_uploadable gem 是否足以一次插入 3-4 百万条记录?是异步过程吗??如果由于某种原因没有插入任何记录,那么我们如何跟踪失败的记录??
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      • 2016-10-16
      • 1970-01-01
      相关资源
      最近更新 更多