Sto provando a creare un programma di utilità rake che aggiornerà il mio database ogni tanto.efficiente database di rotaie di aggiornamento bulk
Questo è il codice che ho finora:
namespace :utils do
# utils:update_ip
# Downloads the file frim <url> to the temp folder then unzips it in <file_path>
# Then updates the database.
desc "Update ip-to-country database"
task :update_ip => :environment do
require 'open-uri'
require 'zip/zipfilesystem'
require 'csv'
file_name = "ip-to-country.csv"
file_path = "#{RAILS_ROOT}/db/" + file_name
url = 'http://ip-to-country.webhosting.info/downloads/ip-to-country.csv.zip'
#check last time we updated the database.
mod_time = ''
mod_time = File.new(file_path).mtime.httpdate if File.exists? file_path
begin
puts 'Downloading update...'
#send conditional GET to server
zipped_file = open(url, {'If-Modified-Since' => mod_time})
rescue OpenURI::HTTPError => the_error
if the_error.io.status[0] == '304'
puts 'Nothing to update.'
else
puts 'HTTPError: ' + the_error.message
end
else # file was downloaded without error.
Rails.logger.info 'ip-to-coutry: Remote database was last updated: ' + zipped_file.meta['last-modified']
delay = Time.now - zipped_file.last_modified
Rails.logger.info "ip-to-country: Database was outdated for: #{delay} seconds (#{delay/60/60/24 } days)"
puts 'Unzipping...'
File.delete(file_path) if File.exists? file_path
Zip::ZipFile.open(zipped_file.path) do |zipfile|
zipfile.extract(file_name, file_path)
end
Iptocs.delete_all
puts "Importing new database..."
# TODO: way, way too heavy find a better solution.
CSV.open(file_path, 'r') do |row|
ip = Iptocs.new( :ip_from => row.shift,
:ip_to => row.shift,
:country_code2 => row.shift,
:country_code3 => row.shift,
:country_name => row.shift)
ip.save
end #CSV
puts "Complete."
end #begin-resuce
end #task
end #namespace
Il problema che sto avendo è che questo richiede pochi minuti per inserire i 100 mila voci più. Mi piacerebbe trovare un modo più efficiente di aggiornare il mio database. Idealmente questo rimarrà indipendente dal tipo di database, ma se non il mio server di produzione verrà eseguito su MySQL.
Grazie per qualsiasi intuizione.
Questo è esattamente quello che stavo cercando, grazie. – codr
La gem supporta l'importazione da CSV. Questo elimina i costi di istanziazione e validazione di 'ActiveRecord'. Fare riferimento a questo articolo per ulteriori dettagli. http://www.rubyinside.com/advent2006/17-extendingar.html –
Aiutato anche a me - grazie! – ambertch