Консолидация миграций Rails/MySql

У меня есть приложение Rails, работающее над базой данных MySql.

Есть ли способ консолидировать миграции? Например:

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

когда я сейчас запущу миграцию, она изменит таблицу 3 раза: добавить name, добавить address и добавить index. и каждый раз команда alter table фактически создает новую таблицу, копирует в нее все данные и удаляет старую таблицу.

в моем случае таблица members очень большая, более 10 миллионов записей, поэтому каждое изменение занимает несколько часов.

есть ли способ объединить изменения в один альтер?


person Ran    schedule 03.10.2011    source источник


Ответы (2)


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

вы можете легко сделать:

class AddNameAddressAndIndexToMembers < ActiveRecord::Migration
  def up
    change_table :members do |t|
      t.string :name
      t.text :address
      t.index :name
    end
  end

  def down
    change_table :members do |t|
      t.remove_index :name
      t.remove :name, :address
    end
  end
end

просто отмените свои миграции, удалите предыдущие файлы миграции, запустите эту миграцию, и все должно быть хорошо.

Теперь, если вы имеете в виду, что это старые миграции, это может быть сложно, потому что вы не хотите отменять множество миграций. Но чего вы хотите добиться? если вам нужно только развернуть, используйте текущий schema.rb с рейк db:schema:dump и rake db:schema:load

person m_x    schedule 03.10.2011

Если вы действительно хотите максимизировать скорость, вам, вероятно, следует рассмотреть возможность развертывания SQL в вызове выполнения, в котором вы можете, например, создать временный набор результатов с желаемой структурой, очистить, удалить и/или изменить существующую таблицу и повторно заполнить эту таблицу из временного набора результатов:

class SQLRevisions < ActiveRecord::Migration
    def change
        execute "
            [SQL PROCESS CALL]
            [SQL PROCESS CALL]
            [ETC.]"
        end
    end

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

person mike montagne    schedule 10.09.2012