所以,我刚才得到了这个工作,想通了我应该回答这个问题。我的第一个问题是我搞砸了database.yml。我遗漏了适配器:mysql2行,所以它试图连接到一个sqlite数据库,因此只读错误。
一旦我改变了这一点,我可以连接到我的AWS RDS实例,并且我可以播种一个记录就好了。但是,当我尝试播种整个500k记录时,它仍然被杀死。我正在使用AWS免费层,所以我认为他们的微型实例出于性能原因不允许长时间运行的进程。为了解决这个问题,我创建了一个rake任务,它将我的seeds.rb文件分割成一堆小文件,例如seeds-01.rb到seeds-1000.rb。
desc "Splits a file into smaller subfiles"
task :subfiles, [:filename, :num_files] => :environment do |task, args|
lines = File.readlines(args[:filename])
num_files = args[:num_files].to_i
lines_per_file = lines.count/num_files
extension = File.extname(args[:filename])
basename = File.basename(args[:filename])
puts lines_per_file.to_s
puts lines.count.to_s
num_files.times do |num_file|
subfile = File.open(basename + "-#{num_file}" + extension, "w")
subline_start = num_file*lines_per_file
subline_end = (num_file+1)*lines_per_file-1
subline_end = lines.count-1 if num_file == num_files-1
sublines = lines[subline_start..subline_end].each do |subline|
subfile.puts subline
end
subfile.close
end
end
于是,我产生一个bash脚本运行的每个文件,就像这样:
rails runner seeds-01.rb
rails runner seeds-02.rb
...
rails runner seeds-1000.rb
应当指出的是,我尝试以下为好,不管出于什么原因,这是非常非常比使用rails runner慢。
sudo cp seeds-01.rb seeds.rb
rake db:seed
...
sudo cp seeds-1000.rb seeds.rb
rake db:seed
所以不要那样做。那么,在我使用弹性beanstalk命令行工具来部署我的应用之后,我使用了我的实例并运行了我的bash脚本。
cd /var/app/current/db
bash bash-script.txt
这确保了文件足够小以至于它停止超时。