что делает rake db: migrate? - PullRequest
23 голосов
/ 17 июня 2009

Добавляет ли rake db: migrate только новые миграции или отбрасывает все миграции / изменения и создает все новое?

Я думаю, что rake выдает ошибку, потому что пытается получить доступ к атрибуту таблицы в миграции 040, которая была удалена в миграции 042. Почему-то мои БД и rake не синхронизированы, и я хочу их исправить.

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

Ответы [ 3 ]

24 голосов
/ 17 июня 2009

Когда вы используете рельсовые миграции, автоматически создается таблица с именем schema_migrations, которая отслеживает, какие миграции были применены, сохраняя номер версии каждой миграции (это число, которое предшествует имени миграции в файле имя, т.е. db / migrate / _20090617111204__migration.rb). Когда вы запускаете rake db:migrate для перехода вверх, будут выполняться только те миграции, которые не были выполнены ранее (т. Е. Их версия не содержится в таблице) (по этой причине изменение уже выполненной миграции не будет иметь эффекта, работает db:migrate). При переходе вниз все версии, найденные в schema_migrations, которые больше версии, на которую вы откатываетесь, будут отменены.

17 голосов
/ 17 июня 2009

Каждый раз, когда вы создаете миграцию с использованием сценариев (например, модель сценария / создания ...), новая миграция добавляется в правильный каталог, готовый для синхронизации с реальной базой данных.

На самом деле rake db: migrate просто проверяет, какие недостающие миграции все еще необходимо применить к базе данных, не заботясь о предыдущих.

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

6 голосов
/ 05 апреля 2010

Миграция означает, что вы переходите от текущей версии к более новой версии (как сказано в первом ответе). С помощью rake db: migrate вы можете применить любые новые изменения к вашей схеме. Но если вы хотите выполнить откат к предыдущей миграции, вы можете использовать rake db: rollback, чтобы аннулировать ваши новые изменения, если они неправильно определены. Внимание: при этом ваши данные будут потеряны.

...