迁移不在Heroku上工作

我在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 ' /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 ' /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 ' 

从这里可以看出,问题线和上面的线是:

 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) 

这在本地工作,在开发和生产环境中都没有任何问题。

有没有人经历过这样的事情?

这是一个有趣的错误,事实certificate,它可以被忽略。 基于它尝试执行db:structure:dump的事实,您使用’sql’作为active_record.schema_format。 rake任务db:structure:dump将在heroku上失败,因为pg_dump(不出所料)不在二进制路径中。 有趣的是, Heroku说不支持db:schema:dump但是如果你将模式格式设置为ruby,它就可以正常工作。

在Rails 3中,转储任务只会引发一个错误,即命令的退出代码是1.在基于unix的系统上,如果找不到该命令,则退出代码为127.所以即使pg_dump命令在rails 3上失败(这样做,它不会引发错误,也不会停止rake任务。 所以任何使用Rails 3的sql架构格式的人都不会有这个问题,因为它会无声地失败。 如果转储失败导致Rails 4中的重构正确引发错误导致db:migrate在Heroku上引发错误。 但是, 即使rake aborted错误,ddl实际上也会被执行并提交

可能的解决方案:

  • 迁移实际正在运行时忽略错误。
  • 由于您不关心生产中的结构转储,因此将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 

接受的解决方案有点正确。 Heroku的运行时确实有pg_dump

 $ heroku run bash $ which pg_dump /usr/bin/pg_dump 

问题来自这个问题: https : //github.com/rails/rails/issues/21226该命令无法正确运行。

如果你需要做db:structure load你可以使用$ heroku pg:psql

 heroku pg:psql -a your-app-name  

来自heroku rake db:结构:加载失败 。

如果你需要转储你可以使用这篇文章https://devcenter.heroku.com/articles/heroku-postgres-import-export还有专门的命令:

  $ heroku pg:pull   # pull from REMOTE_SOURCE_DATABASE to TARGET_DATABASE $ heroku pg:push   # push from SOURCE_DATABASE to REMOTE_TARGET_DATABASE 

如果您需要在运行迁移之前重置数据库,可以使用$ heroku pg:reset