Миграция не работает на 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)
Это работает локально без каких-либо проблем, как в среде разработки, так и в производственной среде.
Кто-нибудь испытал что-нибудь подобное?
Ответы
Ответ 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