Используйте db: migrate: redo при правильной обработке исключений из изменений схемы - PullRequest
1 голос
/ 29 сентября 2010

У меня есть миграция, которая прерывается в середине нескольких изменений схемы.Когда он прерывается, генерируется исключение, и rake db: migrate завершает работу, оставляя мою базу данных в полу-перенастроенном состоянии.

Как я могу настроить его так, чтобы миграция автоматически возвращала только те изменения, которые были выполнены до сих пор?Я хотел бы сделать это глобально, когда в режиме разработки.Конечно, у кого-то есть лучший способ, чем встраивать каждый последующий AR::Migration::ClassMethod в begin; rescue =>e opposite_action; end блок.

Возможно, общий пример в следующем порядке:

#2010010100000000_made_a_typo.rb
class MadeATypo < ActiveRecord::Migration

   def self.up
      rename_column :birds, :url, :photo_file_name
      rename_column :birds, :genius, :species #typo on :genius => :genus
   end
   def self.down
      rename_column :birds, :photo_file_name, :url
      rename_column :birds, :species, :genius
   end
end

Эта миграция завершится неудачновторая строка с «гением столбца не найдена», но не записывает номер миграции в таблицу schema_migrations.Я бы хотел, чтобы он вызывал

rename_column :birds, :photo_file_name, :url #this is a revert of the first line

до того, как исключение было передано из MadeATypo.up.

Ответы на комментарии:

Я понимаю, что mysql может не поддерживать DDL-транзакции, я ищу более прикладное решение, которое (вероятно) использует AR :: Migration.Конечно, кто-то создал плагин, который фиксирует вызовы методов для основного AR: M: ClassMethods и может перематывать их в большинстве случаев, если во время миграции возникает исключение.

Ответы [ 2 ]

1 голос
/ 29 сентября 2010

У меня нет решения, но главная проблема заключается в том, что операторы DDL не могут быть обработаны (по крайней мере, в MySQL, я не знаю, является ли это общим).

Итак, поскольку миграции рассматриваются как атомарные действия вверх / вниз, нет простого способа отменить «половину» миграции - нелегко определить, какие части down соответствуют каким частям up

0 голосов
/ 23 мая 2011

Я не знаю ни одного способа сделать это в настоящее время, но код для обратимых миграций, прибывающих в Rails 3.1, выглядит как хорошая основа для создания этой функции. Смотрите эти ссылки:

Я думаю, что вы могли бы реализовать это, запустив миграцию с рекордера (как в https://github.com/rails/rails/commit/47017bd1697d6b4d6780356a403f91536eacd689#L0R337),, затем переключитесь обратно на активное соединение и запустите рекордер по одной команде за раз, отслеживая, как многие из них завершились. Все, что вам нужно, - это обернуть этот цикл выполнения вперед в begin-rescue-end, который выполняет столько обратных команд, сколько вы успешно выполнили команды forward, если есть исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...