【问题标题】:Migrate not working on Heroku迁移不适用于 Heroku
【发布时间】:2013-06-22 10:15:47
【问题描述】:

我在 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)

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

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

【问题讨论】:

    标签: ruby-on-rails activerecord heroku


    【解决方案1】:

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

    在 Rails 3 中,dump 任务只会引发错误,即命令的退出代码为 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
      

    【讨论】:

    • 我刚刚遇到了同样的问题。在为 Postgres 搜索添加 GIN 索引后,我最初在 application.rb config.active_record.schema_format = :sql 中添加了以下行,根据 Railscasts 第 334 集。那么,在application.rb 中进行更改是否安全,或者我应该将:sql 行移至development.rb,并在production.rb 中使用:ruby
    • 我会将:sql 保留在开发中,以便您可以在structure.sql 文件中保留postgres 的GIN 索引。您应该可以在application.rb 中将其保留为:sql,只需将:ruby 添加到production.rb。这样,您将在开发和测试中保持结构文件相同。
    • 好极了。我遇到了完全相同的问题!我得到的错误(和谷歌搜索):Error: You must install at least one postgresql-client-&lt;version&gt; package. 在这里添加了可搜索性。
    • 另一种解决方案是安装postgresql-client以满足postgresql-client-common的pg_wrapper的要求。
    【解决方案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

    【讨论】:

      猜你喜欢
      • 2011-07-07
      • 2021-06-11
      • 2016-11-14
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 2021-08-29
      相关资源
      最近更新 更多