Как перенести мою базу данных с помощью рельсов в первую ревизию, не отбросив сначала базу данных?

У меня есть база данных, настроенная для моей установки Rails и некоторые настройки миграции. Я хотел бы иметь возможность reset моей базы данных вернуться к отсутствию таблиц/ограничений/и т.д., Но не может найти разумный способ сделать это, не зная количества миграций или отметки времени первой миграции. Вот мои варианты, как я их вижу:

  • rake db:migrate:reset
  • rake db:migrate:down VERSION=20090701154839, где 20090701154839 - это метка времени, связанная с первой миграцией
  • rake db:rollback STEP=15, где было 15 миграций

Проблема с db:migrate:reset заключается в том, что она сначала сбрасывает базу данных (она делает db:drop, db:create, затем db:migrate).

Проблема с db:migrate:down заключается в том, что я не хочу кодировать VERSION начала.

Проблема с db:rollback заключается в том, что я не знаю числа шагов, которые он возвращает к началу.

Каковы мои варианты?

Ответы

Ответ 1

rake db:migrate VERSION=0

Он работает, даже если вы используете новые файлы с отметкой времени.

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

Ответ 2

В дополнение к решению jdl (правильно) выше, еще один способ взлома - сделать rake db:rollback STEP=1000000, где 1000000 - большое число, большее, чем количество миграций, которые вы когда-либо имели. Он будет откатываться, насколько это возможно, до 1000000 раз, или сколько раз вы ставите как STEP.

Ответ 3

Он умеренно взламывает, но вы можете сделать запрос, чтобы найти первую версию в schema_migrations, а затем вызвать rake db: migrate: down, чтобы получить эту VERSION (я предполагаю, что вы хотите упаковать "reset" script для вашего приложения).

Это, конечно, потребует, чтобы методы down на всех ваших миграциях работали правильно.