Подтвердить что ты не робот

Миграция не работает на 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)>'

Как можно видеть здесь проблемная строка и одна над ней:

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)

Это работает локально без каких-либо проблем, как в среде разработки, так и в производственной среде.

Кто-нибудь испытал что-нибудь подобное?

4b9b3361

Ответ 1

Это интересная ошибка, которая, как оказалось, может быть проигнорирована. Исходя из того, что он пытается создать db: structure: dump, вы используете "sql" в качестве вашего active_record.schema_format. Команда rake db: structure: дамп не будет выполняться на герою, потому что pg_dump (неудивительно) не находится в двоичном пути. Интересно, что Heroku утверждает, что db: schema: dump не поддерживается, но если вы установите формат схемы в ruby, он отлично работает.

В Rails 3 задача дампа будет только повышать ошибку, так как код выхода команды равен 1. В системах на основе unix, если команда не найдена, код выхода равен 127. Таким образом, даже если команда pg_dump завершится с ошибкой rails 3 (что он делает), это не вызовет ошибки и не остановит задачу рейка. Поэтому любой, кто использует формат схемы sql с Rails 3, не будет иметь этой проблемы, потому что он будет терпеть неудачу. Рефактор в 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
    

Ответ 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: отказ загрузки.

Если вам нужно сбросить, вы можете использовать эту статью 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

Если вам нужна reset ваша база данных перед запуском миграции, вы можете использовать $ heroku pg:reset