Подтвердить что ты не робот

"pg_dump: недопустимый параметр - i" при переносе

Когда я запускаю rake db:migrate в моем проекте Rails (3.2.22.2), я получаю pg_dump: invalid option -- i. Здесь полный след:

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)

Я заметил, что в этой проблеме есть ошибка в Rails. Исправление ошибки, похоже, не было применено к версиям Rails < 4, поскольку это не исправление безопасности, что имеет смысл.

Я не понимаю, что я должен сейчас делать. Если есть исправление для 3.2.x, я еще не смог его найти. Я думаю, если нет исправления для 3.2.x, я предполагаю, что это означает, что мне нужно обновить до Rails 4.x, что кажется немного резким. Я сомневаюсь, что это единственное решение. И почему проблема недавно появилась из ниоткуда?

Любые предложения приветствуются.

4b9b3361

Ответ 1

Вряд ли есть исправление, поскольку это не проблема безопасности. Даже если бы это было так, я не уверен, что они исправляют 3.x.

Проблема заключается в структуре db: structure: dump здесь:

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

Самое простое - скопировать эту задачу (413 - 448) и поместить ее в свой собственный каталог lib/tasks, обернуть вокруг нее namespace db, настроить команду pg_dump (удалить -i), и ваша задача должна переопределить встроенную в задаче.

Ответ 2

Я столкнулся с этой проблемой также с Rails 3.2.22. Похоже, что это было исправлено в 4.2.5, но для нашей ситуации обновление Rails было не очень практичным.

После рассмотрения некоторых параметров я закончил путь переопределения задачи rake по умолчанию db:structure:dump, которая вызывается после db:migrate.

Я создал файл tasks/database.rake и взломал биты и фрагменты из разных методов ActiveRecord, чтобы создать новую задачу db:structure:dump. Теперь эта новая задача вызывается вместо значения по умолчанию, когда выполняется db:migrate и т.д.

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

Этот код был создан специально для нашего проекта, поэтому, если у вас есть другие настраиваемые конфигурации, такие как db_dir, вам нужно будет соответствующим образом настроить.

Ответ 3

Эта ошибка, поскольку метод "-i" лишен версии 9.5.X и выше. Ошибка исправлена ​​в Rails -v '4.2.5', и вы можете обновить Rails до этой версии или верхней. Но если вам нужен быстрый метод, я думаю, вы останетесь довольны (просто взломайте, не используйте его, если вы немного сомневаетесь или не согласны с ним!):

1) найти этот файл: 'postgresql_database_tasks.rb' (в моем случае это было):

/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) Откройте его, найдите и отредактируйте строку ниже, удалив '-i' из строки:

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

3) сохраните этот файл и снова запустите свою команду рейка! Что это!

Ответ 4

Недавно я получил эту ошибку с Rails 4.2.1 после попытки запустить rake db:migrate.

Мне удалось преодолеть это, обновив до Rails 4.2.6 и позволив bundle update выполнить эту работу, набросив все связанные драгоценные камни.

Надеюсь, что это станет полезным для других.

Ответ 5

В качестве альтернативы вы можете отредактировать локальный pg_dump, чтобы удалить параметр -i. Хотя отдельные установки могут различаться, вот изменения, которые я сделал:

Команда выполняет итерацию через все ее аргументы (строка 36):

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

Найти условное (строка 39):

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

Добавьте следующее (строка 57):

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