Почему db:reset отличается от запуска всех миграций?

В разделе Миграции базы данных Rails руководств Ruby on Rails есть одна строка, в которой говорится, что

Задача db:reset удалит базу данных, создаст ее заново и загрузит в нее текущую схему. Это не то же самое, что выполнение всех миграций.

Может ли кто-нибудь сказать мне, в чем именно они отличаются и почему воспроизведение истории миграции более подвержено ошибкам?

Я новичок в Ruby on Rails. Заранее спасибо.


person Community    schedule 25.11.2011    source источник


Ответы (2)


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

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

person Peter Brown    schedule 25.11.2011

Запуск rake db:reset перестроит структуру вашей базы данных из schema.db, которая по сути работает как кэшированная версия вашей перенесенной структуры базы данных. Запуск всех ваших миграций, с другой стороны, применяет миграции одну за другой, что может включать произвольный код для адаптации к изменениям в базе данных (например, предварительное заполнение добавленного столбца кеша счетчика).

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

person cuvius    schedule 25.11.2011