如何将数据导出到CSV并从Heroku上传到单独的FTP站点?

时间:2011-10-17 22:38:30

标签: ruby-on-rails-3 ftp heroku rake rake-task

我有一些数据要从DB导出并保存为CSV文件,然后上传到FTP服务器。该站点托管在Heroku上,我知道您只能写入tmp(或log?)目录。

这在我的本地计算机上运行良好,但在Heroku上不起作用。

这是我的佣金任务:

require 'csv' 
require 'net/ftp'

task :export_data => :environment do
  path = "tmp/" 
  filename = 'test_' + Date.today.to_s + '.dat' 

  messages = Message.where( :foo => bar) 
  CSV.open(path + filename, "wb", :col_sep => '|') do |csv| 

    messages.each do |m| 
      csv << [m.id.to_s, m.name] 
      puts "Processing message " + m.id.to_s 
    end 
  end 

  puts "Uploading " + filename 
  ftp = Net::FTP.new('ftp.hostname.com') 
  ftp.login(user = "******", passwd = "*******") 
  ftp.puttextfile(path + filename, filename) 
  ftp.quit() 

  puts "Finished." 
end

有两个问题:

Q1。迭代记录的速度非常慢。 200分钟5分钟。我不知道这是否可用。

Q2。 ftp有错误并崩溃。它开始将文件放在FTP服务器上,但不会向其写入任何数据。这是一个空文件。日志显示:

Starting process with command `rake jobs:work`
2011-10-17T21:17:11+00:00 app[worker.1]: (in /app)
2011-10-17T21:17:13+00:00 heroku[worker.1]: State changed from starting to up
2011-10-17T21:17:13+00:00 app[worker.1]: rake aborted!
2011-10-17T21:17:13+00:00 app[worker.1]: Don't know how to build task 'jobs:work'
2011-10-17T21:17:13+00:00 app[worker.1]: /usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:1720:in `[]'
2011-10-17T21:17:13+00:00 app[worker.1]: /usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2040:in `invoke_task'
2011-10-17T21:17:13+00:00 app[worker.1]: /usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2019:in `block (2 levels) in top_level'
2011-10-17T21:17:13+00:00 app[worker.1]: /usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2019:in `each'
2011-10-17T21:17:13+00:00 app[worker.1]: /usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2019:in `block in top_level'
2011-10-17T21:17:13+00:00 app[worker.1]: /usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling'
2011-10-17T21:17:13+00:00 app[worker.1]: /usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:2013:in `top_level'
2011-10-17T21:17:13+00:00 app[worker.1]: /usr/ruby1.9.2/lib/ruby/1.9.1/rake.rb:1992:in `run'
2011-10-17T21:17:13+00:00 app[worker.1]: /usr/ruby1.9.2/bin/rake:31:in `<main>'
2011-10-17T21:17:13+00:00 heroku[worker.1]: Process exited
2011-10-17T21:17:14+00:00 heroku[worker.1]: State changed from up to crashed

该文件无法使用或文件系统存在其他问题?适用于本地机器。

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

答案在

2011-10-17T21:17:13+00:00 app[worker.1]: Don't know how to build task 'jobs:work'

出于某种原因,你的Rakefile不知道工作:工作。考虑到这是一个delayed_job任务,您确定已经正确地介绍了delayed_job安装的每一步吗?

您是否在生产模式下尝试过本地?

答案 1 :(得分:1)

数目:

Q1:它并不慢。它只是看起来很慢,因为慢速部分输出到控制台。

Q2:通过设置ftp.passive = true

来修复FTP