14

pg:resetHeroku で実行し、実行しようとするdb:migrateと、すべての移行が実行されますが、移行は次のエラーとトレースで失敗します。

rake aborted!
Error dumping database
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0.rc2/lib/active_record/tasks/postgresql_database_tasks.rb:55:in `structure_dump'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0.rc2/lib/active_record/tasks/database_tasks.rb:142:in `structure_dump'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0.rc2/lib/active_record/railties/databases.rake:288:in `block (3 levels) in <top (required)>'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0.rc2/lib/active_record/railties/databases.rake:51:in `block (2 levels) in <top (required)>'
/app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.0.rc2/lib/active_record/railties/databases.rake:45:in `block (2 levels) in <top (required)>'

ここでわかるように、問題のある行とその上の行は次のとおりです。

command = "pg_dump -i -s -x -O -f #{Shellwords.escape(filename)} #{search_path} #{Shellwords.escape(configuration['database'])}"
raise 'Error dumping database' unless Kernel.system(command)

これは、開発環境と本番環境の両方で問題なくローカルで機能します。

誰もこのようなことを経験しましたか?

4

2 に答える 2

50

これは興味深いバグであり、結局のところ、無視することができます。db:structure:dump を実行しようとしているという事実に基づいて、active_record.schema_format として「sql」を使用しています。rake タスク db:structure:dump は、pg_dump が (当然のことながら) バイナリ パスにないため、heroku では失敗します。興味深いことに、Heroku はdb:schema:dump はサポートされていないと述べていますが、スキーマ形式を ruby​​ に設定すると問題なく動作します。

Rails 3 では、ダンプ タスクはコマンドの終了コードが 1 の場合にのみエラーを発生させます。UNIX ベースのシステムでは、コマンドが見つからない場合、終了コードは 127 です。したがって、Rails 3 で pg_dump コマンドが失敗したとしても (エラーを発生させず、rake タスクを停止しません。そのため、Rails 3 で SQL スキーマ フォーマットを使用している人は、この問題に遭遇することはありません。ダンプが失敗した場合に適切にエラーを発生させるための Rails 4 のリファクタリングにより、Heroku で db:migrate がエラーを発生させます。ただし、実際には ddlでエラーが発生しrake aborted、コミットされます。

可能な解決策:

  • 移行は実際に実行されているため、エラーは無視してください。
  • 本番環境では構造体のダンプは気にしないので、schema_format を ruby​​ に設定します。でconfig/environments/production.rb

    config.active_record.schema_format = :ruby
    
  • なんらかの理由で構成ファイルを変更したくない場合: エラーを抑制するために、次の rake タスクを追加します。

    if Rails.env == 'production'
        Rake::Task["db:structure:dump"].clear
    end
    
于 2013-06-25T19:41:38.940 に答える