Из-за некоторых проблем с развертыванием я прекратил отслеживать schema.rb в git. Как-то я наполнил это и где-то по пути исчез наш файл schema.rb.
Есть ли способ восстановления schema.rb из базы данных или из миграций? Я бы предпочел не терять существующие данные.
Если вы запустите rake -T
, он перечислит все возможные рейк-задачи для вашего проекта Rails. Один из них - db: schema: dump, который воссоздает schema.rb для приложения Rails из базы данных.
bundle exec rake db:schema:dump
Тщательное,
rake db:schema:dump
сбрасывает текущую схему БД из БД. Это означает, что если вы внесли какие-либо изменения в свои миграции, они будут НЕ отражены в файле schema.rb, который не является тем, что вы хотите ИМО.
Если вы хотите воссоздать схему из миграций, выполните следующие действия:
rake db:drop # ERASES THE DATABASE !!!!
rake db:create
rake db:migrate
rake db:schema:dump
.
rake db:schema:dump
Я думаю, что это все еще актуально в Rails 3 - он восстанавливает schema.rb из базы данных.
Непосредственно из самого файла schema.rb:
Если вам нужно создать базу данных приложения на другом системы, вы должны использовать
db:schema:load
, не запускать все миграции с нуля. Последнее является ошибочным и неустойчивым подходом (чем больше миграций вы будете накапливать, тем медленнее он будет работать и большая вероятность возникновения проблем).
Так что НЕ делайте предложение rake db:migrate
, которое было предложено в - на момент написания этой статьи - самый низкий рейтинг.
Если вы регенерируете schema.rb
локально, вы должны быть в порядке. Он просто содержит представление структуры таблиц базы данных. Сами данные не содержатся в этом файле.
Чтобы восстановить файл schema.rb
, запустите:
bundle exec rake db:schema:dump
Затем просто скопируйте новый файл schema.rb
, и вы должны быть в хорошей форме!
RAILS 5 Путь:
rails db:schema:dump
или если вы встретите Gem:: LoadError, тогда:
bundle exec rails db:schema:dump
Примечание:
в рельсах 5 рекомендуется, чтобы задача генерировалась/выполнялась с помощью rails
вместо rake
, это только для того, чтобы помнить, что созданная rails задача имеет расширение .rake
см. в lib/tasks/myTask.rake
. что означает, что эта задача также может быть выполнена путем добавления rake
.
У меня также была аналогичная проблема, когда моя старая схема не обновлялась, даже если я удалил миграцию.
Итак, что я сделал, это удалить все существующие таблицы в базе данных и снова перенести их. Затем команда "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