迁移不在Heroku上工作

rai*_*400 14 activerecord ruby-on-rails heroku

pg:reset在Heroku上运行并且在尝试运行时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)>'
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

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

Luk*_*und 50

这是一个有趣的错误,事实证明,它可以被忽略.基于它尝试执行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 abortedddl的错误实际上已执行并已提交.

可能的解决方案:

  • 迁移实际正在运行时忽略错误.
  • 由于您不关心生产中的结构转储,因此将schema_format设置为ruby.在config/environments/production.rb:

    config.active_record.schema_format = :ruby
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果由于某种原因您不想更改配置文件:使用以下内容添加rake任务以禁止错误:

    if Rails.env == 'production'
        Rake::Task["db:structure:dump"].clear
    end
    
    Run Code Online (Sandbox Code Playgroud)

  • 高超.我有完全相同的问题!我得到的错误(和谷歌搜索):'错误:您必须至少安装一个PostgreSQL相关的客户端 - <版本> package.`这里增加了搜索能力. (4认同)
  • 我会在开发中保留```:sql```,这样你就可以在```structure.sql```文件中保留postgres的GIN索引.您应该能够将它保存为```application.rb```中的````sql```并将```:ruby```添加到```production.rb```中.这样,您将在开发和测试中保持结构文件相同. (3认同)