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

99

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

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

Теги:
ruby-on-rails-3

7 ответов

160
Лучший ответ

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

bundle exec rake db:schema:dump
  • 0
    Большое спасибо, много ответов, но похоже, что вы были первыми (просто), поэтому отметьте их. Просто любопытно, генерирует ли это схему из самой базы данных или из миграций?
  • 7
    Из самой базы данных, поэтому будьте осторожны, если есть изменения, которые произошли за пределами миграции.
Показать ещё 2 комментария
47

Тщательное,

rake db:schema:dump

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

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

rake db:drop  # ERASES THE DATABASE !!!! 
rake db:create
rake db:migrate
  • 1
    Это может привести к потере данных, которые, по словам ФП, они хотели бы избежать. Кроме того, как отмечает Колин, регенерирование базы данных исключительно из миграций является потенциально очень плохой идеей из-за возросшей возможности столкнуться с нечетными проблемами зависимости (вообще говоря). Если существуют ожидающие миграции, лучше всего выполнить последние миграции на компьютере разработчика, а затем выполнить команду rake db:schema:dump .
  • 3
    Каждый холст четко объяснен в моем ответе. Я укусил ТОЧНО, запустив только схему: дамп и не получая чистую схему. ОП говорит о отслеживании схемы в CVS. Я хотел бы, чтобы моя схема соответствовала моим определениям в моих миграциях, а не устаревшей версии из производственной БД или старой БД разработки
11
rake db:schema:dump

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

3

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

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

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

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

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

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

bundle exec rake db:schema:dump

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

1

RAILS 5 Путь:

rails db:schema:dump

или если вы встретите Gem:: LoadError, тогда:

bundle exec rails db:schema:dump

Примечание:

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

0

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

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

drop table my_table_name // deleted them indivisully
rake db:migrate
rake db:schema:dump // re-created a new schema

Ещё вопросы

Сообщество Overcoder
Наверх
Меню