Является ли rake db: migrate правильной командой для повторной синхронизации schema.rb с вашей схемой базы данных? - PullRequest
17 голосов
/ 09 мая 2009

Я запустил «rake db: migrate» для повторной синхронизации schema.db со своей схемой базы данных. Но это не удалось, сказав, что одна из моих таблиц уже существует. Я думаю, что пытался воссоздать таблицу. Если вы просто хотите обновить schema.rb, чтобы отразить любые изменения, внесенные в базу данных независимо от Rails, какую команду следует использовать, если не «rake db: migrate»? И каков лучший источник документации по этому виду вещей?

Ответы [ 7 ]

19 голосов
/ 09 мая 2009

"rake db: migrate" попытается запустить все ожидающие миграции для вашего проекта. Если вы просто хотите сбросить схему, выполните команду "rake db: schema: dump".
Но я думаю, что у вас есть проблема, когда говорится, что таблица уже существует. Одна из ваших миграций не удалась, потому что таблица, которую она пытается добавить, уже существует в вашей базе данных. Вы создали один вручную? Вы записали миграцию, но не написали для нее? Вам нужно будет это исправить, прежде чем вы сможете написать будущие миграции. Если это просто ошибка, и таблица там и правильно, и вы хотите игнорировать это. Моя рекомендация состоит в том, чтобы обойти это, закомментировав таблицу create в случае сбоя миграции. Затем запустите "rake db: migrate". Затем, но создать таблицу обратно. Это обновит вашу версию схемы.
Удостоверьтесь, что вы записываете правильные ошибки во всех миграциях.

17 голосов
/ 03 июня 2011

Попробуйте

RAILS_ENV=development rake db:drop

до

RAILS_ENV=development rake db:migrate

и будь счастлив!

Убедитесь, что вы запустили его в своей среде тестирования или разработки, поскольку это приведет к удалению базы данных / таблиц

15 голосов
/ 05 августа 2010

Я обнаружил, что иногда, когда все становится немного странным, вы попадаете в ситуацию, когда Rails захочет запустить миграцию, которую он должен по праву считать уже выполненной (таблица уже существует и т. Д.) , Вы можете пометить миграцию как выполненную, найдя ее номер (числовую часть в начале имени файла), перейдя в mysql и выполнив запрос следующим образом:

insert into schema_migrations values('20090521153438');

(или любой другой номер вашей миграции)

Или, если миграция плагина выполняется с помощью migrate_plugin в Desert:

insert into plugin_schema_migrations values('my_plugin', '005');
6 голосов
/ 19 февраля 2013

rake db:migrate:reset удалит все ваши таблицы, запустит все миграции и создаст новый schema.rb файл.

2 голосов
/ 23 марта 2015

Использование 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 без повторного выполнения каких-либо миграций или удаления каких-либо таблиц (что подразумевает потерю данных в этих таблицах), поэтому это наименее инвазивный способ, который вы можете попробовать сначала. *

2 голосов
/ 09 мая 2009

Попробуйте rake db:schema:dump или rake db:migrate:redo.

1 голос
/ 09 мая 2009

отвечая на ваш последний вопрос относительно документации:

...