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