2012-04-20 2 views
4

Я получаю сообщение об ошибке:грабли БД: структура: свалка терпит неудачу при PostgreSQL/Rails 3.2

 
pg_dump: too many command-line arguments (first is "demo_db") 
Try "pg_dump --help" for more information. 
rake aborted! 
Error dumping database 

Tasks: TOP => db:structure:dump 
(See full trace by running task with --trace) 

Это используется для работы в Rails 3.1. Я использую Rails 3.2.3 и PostgreSQL 9.0.5. Другие задачи, такие как db: migrate или db: rollback работают просто отлично.

+0

см. Ответ здесь: http://stackoverflow.com/a/13733565/168143 –

+0

Джон, спасибо, но моя проблема была другой. См. Мое принятое решение. –

ответ

5

Благодаря dbenhur я нашел проблему. У меня есть пробел на пути к имени моего файла. Изменение линии 392 activerecord/lib/active_record/railties/databases.rake к

pg_dump -i -s -x -O -f '#{filename}' #{search_path} #{abcs[Rails.env]['database']} 

(добавляя одиночные кавычки #{filename}) устраняет проблему.

+1

Вы отправили патч? –

+0

@KonstantinGredeskoul последний источник использует ['Shellwords.escape'] (https://github.com/rails/rails/blob/3-2-stable/activerecord/lib/active_record/railties/databases.rake#L428) on имя файла и имя базы данных (но, что любопытно, а не путь search_path); так что теперь намного лучше. Хотя действительно использование ['Open3 :: capture2'] (http://www.ruby-doc.org/stdlib-2.0/libdoc/open3/rdoc/Open3.html#method-c-capture2) с аргументами массива, как правило, безопаснее чем ['Kernel :: \' '] (http://www.ruby-doc.org/core-2.0/Kernel.html#method-i-60) – dbenhur

+0

Спасибо, я исследовал данную строку. И для меня это не работает, потому что PATH в среде весны не содержит путь к pg_dump. –

7

Команда pg_dump выполнена в activerecord/lib/active_record/railties/databases.rake at line 428.

`pg_dump -i -s -x -O -f #{Shellwords.escape(filename)} #{search_path} #{Shellwords.escape(config['database'])}` 

Попробуйте установить там точку останова и посмотреть, какая фактическая команда выполняется.

Все эти опции действительны для Pg9.0.x, поэтому я подозреваю, что в abcs[Rails.env]['schema_search_path'] есть что-то смешное, что смущает разбор параметров psql. Обратите внимание, что в конструкции search_path не приводится аргумент --schema, поэтому search_path_part со встроенным пространством будет анализироваться как имя частичной схемы, за которым следует слово, которому не предшествует опция, поэтому psql будет интерпретировать его как имя базы данных, затем жалуйтесь, когда он попадает в настоящее имя базы данных позже.

+0

Спасибо, используя эту технику, я нашел ошибку (отсутствующие одинарные кавычки вокруг имени файла). См. Мой ответ. –

0

Я исправил эту (темную) проблему, создав новое приложение с базой данных postgresql в качестве базы данных (rails new MyApp -d postgresql), а затем переместил все мои старые файлы приложений (/ папку приложения, миграции и некоторые/файлы конфигурации) на новый. Теперь, когда я запускаю rake db: migrate, нет ошибки pg_dump. Я надеюсь, что это помогает кому-то.

1

У меня была проблема simillar с db: structure: dump on my setup. Rails 3.2.11 + JRuby 1.7.1 [режим 1.8] Postgresql 9.1.7.

Единственное, что действительно помогло - это понизить активность activerecord_jdbc_adapter с версии 1.2.5 до 1.2.2.

gem 'activerecord-jdbc-adapter', '1.2.2' 
gem "activerecord-jdbcpostgresql-adapter", '1.2.2' 

Надеюсь, это поможет кому угодно.