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

133

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

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

штифтик
источник

Ответы:

230

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

bundle exec rake db:schema:dump
mguymon
источник
Большое спасибо, много ответов, но похоже, что вы были первыми (просто), поэтому отметьте их. Просто любопытно, генерирует ли это схему из самой базы данных или из миграций?
Брэд
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 из базы данных.

pschuegr
источник
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
R.Cha
источник