迁移不在Heroku上工作

时间:2013-06-25 14:40:14

标签: ruby-on-rails activerecord 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 <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)

无论是在开发环境还是生产环境中,这都可以在本地运行。

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

2 个答案:

答案 0 :(得分:50)

这是一个有趣的错误,事实证明,它可以被忽略。基于它尝试执行db:structure:dump的事实,您使用'sql'作为active_record.schema_format。 rake任务db:structure:dump将在heroku上失败,因为pg_dump(不出所料)不在二进制路径中。有趣的是,Heroku states不支持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
    

答案 1 :(得分:2)

接受的解决方案有点正确。 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 <db/structure.sql

来自heroku rake db:structure:load failure

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

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

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