Потерял мою схему.рб! Это может быть восстановлено?


133

Из-за некоторых проблем с развертыванием я перестал отслеживать schema.rb в git. Каким-то образом я заполнил это и где-то по пути исчез мой файл schema.rb.

Есть ли способ регенерации schema.rb из базы данных или из миграций? Я бы предпочел не потерять существующие данные.

Ответы:


230

Если вы запустите, rake -Tон перечислит все возможные грабли для вашего проекта Rails. Одним из них является db: schema: dump, который воссоздает schema.rb для приложения Rails из базы данных.

bundle exec rake db:schema:dump

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

7
Из самой базы данных, поэтому будьте осторожны, если есть изменения, которые произошли за пределами миграции.
Mguymon

1
schema.rb все еще содержит пустую схему после того, как rake db:schema:dumpна рельсах 2.0
Уилл Хардвик-Смит

Мой файл schema.rb остается точно таким же после выполнения вышеуказанных команд
stevec

59

Осторожный,

rake db:schema:dump

сбросит текущую схему БД ИЗ БД . Это означает, что если вы внесли какие-либо изменения в свои миграции, они НЕ будут отражены в файле schema.rb, который не соответствует IMO.

Если вы хотите заново создать схему из миграций, сделайте следующее:

rake db:drop  # ERASES THE DATABASE !!!! 
rake db:create
rake db:migrate

1
Это может привести к потере данных, которые, по словам ФП, они хотели бы избежать. Кроме того, как отмечает Колин, регенерация базы данных исключительно из миграций - потенциально очень плохая идея из-за возросшей возможности столкнуться с нечетными проблемами зависимости (вообще говоря). Если есть ожидающие миграции, лучше всего выполнить последние миграции на компьютере разработчика, а затем выполнить rake db:schema:dumpкоманду.
Пол Рихтер

4
Каждый холст четко объяснен в моем ответе. Я укусил ТОЧНО, запустив только схему: дамп и не получая чистую схему. ОП говорит о отслеживании схемы в CVS. Я хотел бы, чтобы моя схема соответствовала моим определениям в моих миграциях, а не устаревшей версии из производственной БД или из старой БД разработки
gamov

11
rake db:schema:dump

Я думаю, что это все еще действует в Rails 3 - он восстанавливает schema.rb из базы данных.


8

РЕЙЛИ 5 Путь:

rails db:schema:dump

или если вы обнаружили Gem :: LoadError, то:

bundle exec rails db:schema:dump

Примечание:

в рельсах 5 рекомендуется, чтобы задача генерировалась / выполнялась с использованием railsвместо rake, это просто для запоминания, сгенерированная рельсами задача имеет расширение, .rakeсм. в lib/tasks/myTask.rake. Это означает, что эти задачи также могут быть выполнены путем добавления rake.


5

Если вы регенерируете schema.rbлокально, вы должны быть в порядке. Он просто содержит представление о структуре таблиц вашей базы данных. Сами данные не содержатся в этом файле.

Чтобы восстановить ваш schema.rbфайл, запустите:

bundle exec rake db:schema:dump

Затем просто зафиксируйте новый schema.rbфайл, и вы будете в хорошей форме!


4

Непосредственно из самого файла schema.rb:

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

Так что НЕ делайте предложение о том rake db:migrate, что было предложено - на момент написания этой статьи - ответ с самым низким рейтингом.


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

1

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

Итак, я удалил все существующие таблицы в базе данных и снова перенес их. Затем команда «db: schema: load» дала мне свежий файл schema.rb.

drop table my_table_name // deleted them individually
rake db:migrate
rake db:schema:dump // re-created a new schema
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.