2013-05-08 3 views
12

В настоящее время я работаю с огромным приложением рельсов и несколькими ветвями с каждой новой функцией для этого приложения. Очень часто функция требует миграции, которая не должна быть проблемой, пока вы не объедините ее с хозяином: schema.rb обновлен с информацией о вашей базе данных разработчиков!schema.rb испорчен из-за миграции в других ветвях

Для уточнения:

1. Branch A has migration create_table_x 
2. Branch B has migration create_table_y 
3. Branch A adds another create_table_z and runs db:migrate 
4. You want to merge Branch A with Master and you see table_x, table_y and table_z in the schema.rb of Branch A. 

Это не вариант для сброса + заполнений базы данных перед каждой миграцией в отрасли или создать базу данных на каждый филиал. Из-за огромного размера данных объемом 2 ГБ SQL это было бы невозможно.

Мой вопрос:

ли это действительно необходимо, чтобы держать schema.rb в хранилище, так как он получает перестроен каждую миграцию?

Если да, возможно ли построить схему с миграций вместо дампа базы данных?

+0

Я думаю, что вы должны хранить свой schema.rb в своем репозитории. Может случиться так, что кто-то очистит файлы миграции и удалит несколько неиспользуемых миграций из прошлого. И если у вас нет единой схемы schema.rb, я могу оказаться в беспорядке. файл схемы обновляется каждый переход, а не полностью перестраивается. но в любом случае интересный вопрос. – Mattherick

+0

Да, проблема заключается в том, что она создается из текущей структуры базы данных, независимо от того, были ли добавлены таблицы в базе данных в родительском или ветке, в которой вы находитесь. То, что я имел в виду с «перестроенным». Я надеюсь, что кто-то знает более хороший способ, чем сбросить/скопировать базу данных с мастера каждый раз, когда вы переключаете ветвь с миграциями :) – Vikko

+0

Возможный дубликат [Что является предпочтительным способом управления schema.rb в git?] (Http: // stackoverflow .com/questions/737854/what-is-the-preferred-way-to-manage-schema-rb-in-git) – Tachyons

ответ

9

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

  1. Обязательно? не очень, но хорошая практика.

«Настоятельно рекомендуется проверить этот файл в систему управления версиями .» -schema.rb

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

вы GE Шарлем Дополнительное преимущество использования

rake db:schema:load 

и

rake db:schema:dump 

http://tbaggery.com/2010/10/24/reduce-your-rails-schema-conflicts.html

2

Сохранение schema.rb в репо важно, потому что вы хотите, чтобы новый разработчик (или ваша тестовая среда) мог создавать новую базу данных только из schema.rb. Когда у вас много миграций, они могут не все продолжать работать, особенно если они полагаются на классы моделей, которые не существуют или не изменились или имеют разные проверки, чем при первом запуске миграции. Когда вы запускаете свои тесты, вы хотите сбросить и воссоздать свою базу данных из schema.rb, а не перезапускать все миграции каждый раз, когда вы запускаете полный набор тестов.

Если вы работаете одновременно с двумя различными ветвями функций и меняете структуру базы данных в обоих, я думаю, что schema.rb - это наименьшая из ваших проблем. Если вы переименуете или удалите столбец в ветви B, ветвь A будет разбиваться всякий раз, когда она ссылается на старый столбец. Если все, что они делают, это создание новых таблиц, это не так уж плохо, но тогда вы хотите, чтобы schema.rb обновлялся при слиянии с мастером в A, чтобы A не пытался запустить миграцию во второй раз и сбой, потому что новая таблица уже существует.

Если это не ответит на ваш вопрос, возможно, вы могли бы объяснить свой рабочий процесс немного больше?

+0

Это правильно, но вам не нужны таблицы ветви B (где вы выполнили миграции) отображаются в master перед тем, как вы объедините ветвь B. Например: если есть таблица, которая используется как в ветке A, так и в ветве B, ** ветвь B меняет имя на last_name **, ** ветвь A изменяет инициалы на имя**. Вы объединяете ветвь A, вы не объединяете ветвь B, потому что она имеет некоторые сложности => созданная схема ** содержит first_name и last_name **, тогда как вы предпочитаете ** имя_пользователя и имя **. Некоторая логика может быть неплохо проверить миграцию, а не на мастер и откатить их в schema.rb – Vikko

+0

Это звучит хорошо сначала, но некоторые миграции могут быть не столь обратимыми. Вы могли бы выполнить это вручную через: rake db: migrate VERSION = 123 где 123 - номер миграции в вашем schema.rb. Это должно мигрировать либо вперед, либо назад по мере необходимости, чтобы добраться до этой версии. В конечном счете, ваш лучший выбор будет заключаться в том, чтобы как можно скорее получить миграцию из каждой ветки, объединенной в мастера, даже если вам нужно сделать это путем сбора вишни. – sockmonk

+1

Я знаю об этом, но проблема связана с примерно 20 ветвями, которые имеют всю жизнь между несколькими часами и несколькими месяцами. То, где возникают осложнения: вы забываете, что в ветке произошли миграции, и вы ввернуты ! Кроме того, миграция на большой стол (100.000+ записей) занимает возраст. Вы предпочтете оставить их там для разработки и обновить только схему, если таблица не используется в вашей текущей ветке. – Vikko

1

Fresh Temporary DB как быстро обходного

Например, выполните следующие действия всякий раз, когда вам нужно довольно db/schema.rb на конкретной отрасли:

  1. мерзавец кассе - дБ/schema.rb
  2. переход на другую базу данных развития, то есть обновление конфигурации/database.yml
  3. грабли БД: падение & & грабли БД : установка
  4. грабли БД: мигрировать
  5. фиксирования довольно дб/schema.rb
  6. отменить изменения в конфигурации/database.yaml

 Смежные вопросы

  • Нет связанных вопросов^_^