Как экспортировать данные в CSV и загрузить на отдельный FTP-сайт из Heroku?

У меня есть некоторые данные для экспорта из БД и сохранения в виде файла 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

Есть 2 проблемы:

Q1. Перебор записей происходит невероятно медленно. 5 минут за 200. Не знаю, будет ли это полезно.

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

Есть ли проблема с недоступным файлом или какая-то другая проблема с файловой системой? Работает на локальной машине.

Любые идеи?

Спасибо.


person B Seven    schedule 17.10.2011    source источник


Ответы (2)


Ответ в

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

По какой-то причине ваш Rakefile не знает о job:work. Учитывая, что это задача delayed_job, уверены ли вы, что правильно рассмотрели каждый шаг установки delayed_job?

Вы пробовали это локально в производственном режиме?

person Neil Middleton    schedule 18.10.2011
comment
На самом деле я не запускаю отложенную работу. Я выполнил задачу rake, используя rake heroku. Оказывается, проблема была в режиме ftp. ftp.passive = true исправил вторую ошибку. - person B Seven; 18.10.2011

Ответы:

Q1: Это не медленно. Это выглядит медленным только потому, что медленная часть выводится на консоль.

Q2: FTP был исправлен установкой ftp.passive = true

person B Seven    schedule 06.11.2011
comment
Я использовал консоль heroku для одноразового экспорта данных и настройки, которые исправили ошибку 500, которую я получал. - person agmcleod; 03.01.2012