我在Heroku上运行pg:reset,并尝试运行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)>'
可以看出,here的问题线和上面的一个是:
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)
在开发和生产环境中,这在本地工作无任何问题.
有没有人经历过这样的事情?
解决方法
这是一个有趣的错误,事实证明,可以忽略.基于它试图做一个db:structure:dump的事实,你使用’sql’作为你的active_record.schema_format. rake任务db:结构:dump将在heroku上失败,因为pg_dump(不出意料)不在二进制路径中.有趣的是,Heroku states该db:schema:dump不受支持,但是如果您将模式格式设置为ruby,则可以正常工作.
在Rails 3中,转储任务只会引发命令的退出代码为1的错误.在基于unix的系统上,如果没有找到命令,则退出代码为127.因此,即使pg_dump命令在rails 3(它是什么),它不会引发错误,它不会停止耙子任务.所以任何使用Rails 3的sql架构格式的人都不会有这个问题,因为它会默认失败.如果转储失败导致Rails 4中的重构器正确引发错误导致db:migrate在Heroku上引发错误.然而,即使在rake中断时,ddl实际上被执行并且被提交.
可能的解决方案:
>迁移实际运行时忽略该错误.
>由于您不关心生产中的结构转储,请将schema_format设置为ruby.在config / environments / production.rb中:
config.active_record.schema_format = :ruby
>如果由于某些原因您不想更改配置文件:添加以下的耙子任务来抑制错误:
if Rails.env == 'production' Rake::Task["db:structure:dump"].clear end