Я запускал "rake db: migrate" для повторной синхронизации schema.db с моей схемой базы данных. Но это провалилось, сказав, что одна из моих таблиц уже существует. Я думаю, он пытался воссоздать таблицу. Если вы просто хотите обновить schema.rb, чтобы отразить любые изменения, внесенные в базу данных независимо от Rails, какую команду вы должны использовать, если не "rake db: migrate"? И какой лучший источник документации по этому типу?
Является ли rake db: перенаправить правильную команду для повторной синхронизации schema.rb с вашей схемой базы данных?
Ответ 1
"rake db: migrate" попытается выполнить все выдающиеся миграции для вашего проекта. Если вы просто хотите сбросить схему, выполните "rake db: schema: dump".
Но я думаю, что у вас есть проблема, когда говорится, что таблица уже существует. Одна из ваших миграций терпит неудачу, потому что таблица, которую она пытается добавить, уже существует в вашем db. Вы создали его вручную? У вас была миграция, но не было написано для этого? Вам нужно будет исправить это, прежде чем вы сможете писать будущие миграции. Если это просто ошибка, и таблица есть и правильная, и вы хотите проигнорировать это. Моя рекомендация состоит в том, чтобы взломать его, комментируя таблицу создания при неудачной миграции. Затем запустите "rake db: migrate". Затем создайте таблицу. Это обновит вашу версию схемы.
Убедитесь, что вы написали правильные сокращения во всех миграциях.
Ответ 2
Try
RAILS_ENV=development rake db:drop
перед
RAILS_ENV=development rake db:migrate
и будьте счастливы!
Убедитесь, что вы запустили его в тестовой среде или среде разработки, так как это приведет к удалению базы данных/таблиц
Ответ 3
Я обнаружил, что иногда, когда ситуация становится немного странной, вы окажетесь в ситуации, когда Rails захочет запустить миграцию, которую он должен правильно рассмотреть (уже существует таблица и т.д.), Вы можете отметить миграцию, выполнив ее поиск (номер числа в начале имени файла), перейдя в mysql и выдав такой запрос:
insert into schema_migrations values('20090521153438');
(или какой бы ни был номер вашей миграции)
Или если это миграция плагина выполняется с помощью Desert migrate_plugin:
insert into plugin_schema_migrations values('my_plugin', '005');
Ответ 4
rake db:migrate:reset
удалит все ваши таблицы, запустит все миграции и создаст новый файл schema.rb
.
Ответ 5
Попробуйте rake db:schema:dump
или rake db:migrate:redo
.
Ответ 6
Используйте rake db:schema:dump
.
$ rake -T | grep schema
rake db:schema:dump # Create a db/schema.rb file that is portable
# against any database supported by ActiveRecord
rake db:schema:dump
повторно создает файл db/schema.rb
, не перезапуская какие-либо из ваших миграций, или не удаляет любые таблицы (что подразумевает потерю данных в этих таблицах), поэтому это наименее инвазивный способ, который вы можете попробовать первым.
Ответ 7
ответив на ваш последний вопрос относительно документации:
- руководство по рельсам rake для рельсов 2.1+: http://www.tutorialspoint.com/ruby-on-rails-2.1/rails-and-rake.htm
- хороший скринкаст по миграции: http://railscasts.com/episodes/107-migrations-in-rails-2-1