2016-03-14 14 views
13

Quando corro rake db:migrate sul mio progetto Rails (3.2.22.2) ottengo pg_dump: invalid option -- i. Ecco la traccia completa:"pg_dump: opzione non valida - i" durante la migrazione

Celluloid 0.17.1.1 is running in BACKPORTED mode. [ http://git.io/vJf3J ] 
[DEPRECATION] `last_comment` is deprecated. Please use `last_description` instead. 
[DEPRECATION] `last_comment` is deprecated. Please use `last_description` instead. 
[DEPRECATION] `last_comment` is deprecated. Please use `last_description` instead. 
[DEPRECATION] `last_comment` is deprecated. Please use `last_description` instead. 
[DEPRECATION] `last_comment` is deprecated. Please use `last_description` instead. 
pg_dump: invalid option -- i 
Try "pg_dump --help" for more information. 
rake aborted! 
Error dumping database 
/Users/jasonswett/.rvm/gems/[email protected]/gems/activerecord-3.2.22.2/lib/active_record/railties/databases.rake:429:in `block (3 levels) in <top (required)>' 
/Users/jasonswett/.rvm/gems/[email protected]/gems/activerecord-3.2.22.2/lib/active_record/railties/databases.rake:202:in `block (2 levels) in <top (required)>' 
/Users/jasonswett/.rvm/gems/[email protected]/gems/activerecord-3.2.22.2/lib/active_record/railties/databases.rake:196:in `block (2 levels) in <top (required)>' 
/Users/jasonswett/.rvm/gems/[email protected]/bin/ruby_executable_hooks:15:in `eval' 
/Users/jasonswett/.rvm/gems/[email protected]/bin/ruby_executable_hooks:15:in `<main>' 
Tasks: TOP => db:structure:dump 
(See full trace by running task with --trace) 

mi accorgo che c'è un bugfix in Rails relativi a questo problema. Sembra che il bugfix non sia stato applicato alle versioni di Rails < 4 poiché non è una correzione di sicurezza, il che ha senso.

Quello che non capisco è quello che dovrei fare ora. Se c'è una correzione per 3.2.x, non sono ancora riuscita a trovarla. Immagino che se non ci fosse una correzione per 3.2.x, suppongo che ciò significhi che devo aggiornare a Rails 4.x, che sembra un po 'drastico. Dubito che sia davvero l'unica soluzione. E perché il problema è saltato fuori dal nulla solo di recente?

Qualsiasi suggerimento è gradito.

risposta

12

È improbabile che vi sia una correzione in quanto non si tratta di un problema di sicurezza. Anche se lo fosse, non sono sicuro che stiano aggiornando 3.x più.

Il problema è nel db: struttura: discarica compito qui:

https://github.com/rails/rails/blob/v3.2.22.2/activerecord/lib/active_record/railties/databases.rake#L428

cosa più semplice è quello di copiare tale compito (413-448) e metterla in una propria directory/compiti lib, avvolgere a namespace db attorno ad esso, modificare il comando pg_dump (remove -i) e l'attività dovrebbe sovrascrivere l'attività incorporata.

+0

Ah, quindi in pratica scrivi la mia versione di 'rake db: migrate' (copiando la sorgente Rails) con -i estratto? –

+1

Per funzionare ho dovuto aggiungere 'Rake :: Task [" db: structure: dump "]. Clear' all'inizio E cambiare [questa riga] (https://github.com/rails/rails/blob/ v3.2.22.2/activerecord/lib/active_record/railties/databases.rake # L447) a 'Rake :: Task [" db: structure: dump "]. riattiva' –

1

Ho recentemente ricevuto questo errore con Rails 4.2.1 dopo aver tentato di eseguire rake db:migrate.

Sono stato in grado di risolverlo aggiornando a Rails 4.2.6 e lasciando che bundle update esegua il lavoro sbattendo tutte le gemme correlate.

Speranza che diventa utile per gli altri.

2

Questo errore perché il metodo '-i' è stato svuotato in 9.5.X e versioni successive. Corretto un bug in Rails -v '4.2.5' e puoi aggiornare i tuoi Rails a questa versione o in alto. Ma se hai bisogno di un metodo veloce penso che ne sarai soddisfatto (è solo un hacking, non usarlo se hai qualche dubbio o non sei d'accordo!):

1) trova questo file : 'postgresql_database_tasks.rb' (nel mio caso è stato):

/Users/YourUserName/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/activerecord-4.2.4/lib/active_record/tasks/postgresql_database_tasks.rb 

2) Aprire, trovare e modificare la linea di seguito con remove '-i' da stringa:

command = "pg_dump -s -x -O -f #{Shellwords.escape(filename)} #{search_path} #{Shellwords.escape(configuration['database'])}" 

3) salvare questo file e ricomincia il tuo rake task! Che!

+2

Hacking activerecord non è una buona opzione – dft

0

In alternativa, è possibile modificare il locale pg_dump per rimuovere l'opzione -i.Anche se le singole installazioni possono essere diversi, ecco le modifiche che ho fatto:

I itera comando attraverso tutti i suoi argomenti (linea 36):

for (my $i = 0; $i <= $#ARGV; ++$i) { 

trovare la condizionale (linea 39):

if ($ARGV[$i] eq '--cluster') { 

Aggiungere il seguente (linea 57):

} elsif ($ARGV[$i] eq '-i') { 
    splice @ARGV, $i, 1; 
} 
11

Ho riscontrato anche questo problema con Rails 3.2.22. Sembra che questo fosse fixed in 4.2.5, ma per la nostra situazione, l'aggiornamento di Rails non era molto pratico.

Dopo aver considerato alcune opzioni, ho terminato il percorso di override del task rake predefinito db:structure:dump che viene chiamato dopo db:migrate.

Ho creato un file tasks/database.rake e ho hackerato bit e frammenti di diversi metodi ActiveRecord per creare una nuova attività db:structure:dump. Ora questa nuova attività viene chiamata al posto del valore predefinito quando viene eseguito db:migrate, ecc.

Rake::Task["db:structure:dump"].clear 
namespace :db do 
    namespace :structure do 
    desc "Overriding the task db:structure:dump task to remove -i option from pg_dump to make postgres 9.5 compatible" 
    task dump: [:environment, :load_config] do 
     config = ActiveRecord::Base.configurations[Rails.env] 
     set_psql_env(config) 
     filename = File.join(Rails.root, "db", "structure.sql") 
     database = config["database"] 
     command = "pg_dump -s -x -O -f #{Shellwords.escape(filename)} #{Shellwords.escape(database)}" 
     raise 'Error dumping database' unless Kernel.system(command) 

     File.open(filename, "a") { |f| f << "SET search_path TO #{ActiveRecord::Base.connection.schema_search_path};\n\n" } 
     if ActiveRecord::Base.connection.supports_migrations? 
     File.open(filename, "a") do |f| 
      f.puts ActiveRecord::Base.connection.dump_schema_information 
      f.print "\n" 
     end 
     end 
     Rake::Task["db:structure:dump"].reenable 
    end 
    end 

    def set_psql_env(configuration) 
    ENV['PGHOST']  = configuration['host']   if configuration['host'] 
    ENV['PGPORT']  = configuration['port'].to_s  if configuration['port'] 
    ENV['PGPASSWORD'] = configuration['password'].to_s if configuration['password'] 
    ENV['PGUSER']  = configuration['username'].to_s if configuration['username'] 
    end 
end 

Questo codice è stato creato appositamente per il nostro progetto, quindi se avete altre configurazioni personalizzate impostate come db_dir, è necessario regolare di conseguenza.

Problemi correlati