Rails rake db: миграция не имеет никакого эффекта - PullRequest
30 голосов
/ 08 апреля 2011

Сегодня я сделал новое приложение на Rails 3, добавил простую миграцию, и почему-то ничего не происходит, когда я делаю rake db: migrate.Он просто делает паузу на несколько секунд, затем возвращается в командную строку, без ошибок или чего-либо еще.Schema.rb и база данных остаются пустыми.

Есть идеи, что может произойти?Я сделал много приложений и никогда не имел этой проблемы.Все тоже полностью стандартная настройка.

Ответы [ 5 ]

64 голосов
/ 09 апреля 2011

Существует несколько причин, по которым ваши миграции не будут выполняться, но наиболее распространенным является то, что в системе уже создается впечатление, что все определенные вами миграции уже запущены.

Каждая миграция создает запись в таблице schema_migrations со столбцом version, соответствующим номеру идентификатора. Если вы хотите перезапустить миграцию, вы обычно можете отменить ее и повторить попытку. Например, если бы у вас было 20100421175455_create_things.rb, вы бы запустили его заново, используя:

rake db:migrate:redo VERSION=20100421175455

Распространенной ситуацией является то, что ваша миграция не была запущена в первую очередь, что она сгенерировала, например, исключение, и все же Rails по-прежнему считает его завершенным. Для принудительного повторного запуска миграции удалите соответствующую запись из таблицы schema_migrations и снова запустите rake db:migrate.

Один из способов избежать подобных проблем в будущем - определить миграции с помощью автоматической процедуры возврата:

class CreateThings < ActiveRecord::Migration
  def self.up
    # ... (migration) ...

  rescue
    # If an exception occurs, back out of this migration, but ignore any
    # exceptions generated there. Do the best you can.
    self.down rescue nil

    # Re-raise this exception for diagnostic purposes.
    raise
  end
end

Если у вас возникла ошибка при переносе, вы увидите исключение, указанное на консоли. Поскольку миграция автоматически откатывается, вы сможете запускать ее снова и снова, пока не сделаете все правильно.

1 голос
/ 24 сентября 2017

Звонок spring stop может решить ваши проблемы.

0 голосов
/ 05 июня 2015

Я столкнулся с подобной проблемой сегодня при переносе плагина для Redmine, используя

rake redmine:plugins:migrate RAILS_ENV=production NAME=plugin_name

где plugin_name - это имя плагина, определенное в init.rb плагина.

Я боролся 4 часа и наконец понял, что имя моего каталога плагинов не совпадает с именем плагина (примечание redmine_ префикс):

~/redmine/plugins/redmine_plugin_name

Итак, убедитесь, что ваш плагин находится в папке, названной в честь имени плагина. Я полагаю, что это относится и к другим приложениям rails.

0 голосов
/ 13 апреля 2015

Я столкнулся с той же проблемой. Я сделал своего рода короткий хак, который помог мне. Я публикую это на всякий случай, если кто-то захочет получить краткое и приятное решение Я согласен с тем, что говорит Тадман

"система уже под впечатлением, что все миграции вы определили, что уже запустили "

Я изменил имя файла переноса в папке / app_folder / db / migrate . Я думаю, что числовая часть в имени файла переноса ruby ​​- это время, когда файл был создан.

Вы можете добавить, скажем, 1, к имени файла, каждый раз, когда вы хотите повторно запустить миграцию. После изменения имени удалите / удалите таблицу (я использовал инструмент командной строки mysql для удаления), а затем запустите rake db: migrate , и миграции должны быть выполнены.

0 голосов
/ 09 апреля 2011

Ну, я выяснил, в чем причина моей проблемы.Я использую камень slim_scrooge и комментирую его, чтобы все прошло нормально.Хотя не знаю почему ...

...