Я работаю над приложением rails с довольно большим количеством веток git, и многие из них включают миграции db. Мы стараемся быть осторожными, но иногда какой-то фрагмент кода в master запрашивает столбец, который был удален / переименован в другой ветке.
Что было бы хорошим решением, чтобы «связать» ветки git с состояниями БД?
Какими бы были эти «состояния» на самом деле?
Мы не можем просто скопировать базу данных, если она размером несколько гигабайт.
А что должно происходить со слияниями?
Будет ли решение переведено и на базы данных noSQL?
В настоящее время мы используем MySQL, mongodb и redis
РЕДАКТИРОВАТЬ: Похоже, я забыл упомянуть очень важный момент, меня интересует только среда разработки, но с большими базами данных (размером несколько ГБ).
источник
Ответы:
Когда вы добавляете новую миграцию в любую ветку, запустите
rake db:migrate
и зафиксируйте миграцию иdb/schema.rb
Если вы сделаете это, в процессе разработки вы сможете переключиться на другую ветку, которая имеет другой набор миграций, и просто запустить ее
rake db:schema:load
.Обратите внимание, что при этом будет воссоздана вся база данных, а существующие данные будут потеряны .
Вероятно, вы захотите запустить производство только из одной ветки, с которой вы очень осторожны, поэтому эти шаги не применяются там (просто выполняйте там
rake db:migrate
как обычно). Но в процессе разработки воссоздание базы данных из схемы не составит большого труда, что иrake db:schema:load
будет делать.источник
db/seeds.rb
Это не должно быть слишком разрушительным, если вы настроите там некоторые разумные исходные данные.db/seeds.rb
для пополнения потерянных данных БДЕсли у вас большая база данных, которую вы не можете легко воспроизвести, я бы рекомендовал использовать обычные инструменты миграции. Если вам нужен простой процесс, я бы порекомендовал следующее:
rake db:rollback
выполните rollback ( ) в состояние до точки ветвления. Затем, переключив ветки, запуститеdb:migrate
. Это математически правильно, и пока вы пишетеdown
сценарии, это будет работать.источник
rake db:schema:load
и,rake db:seed
как сказал @noodl.Вот сценарий, который я написал для переключения между ветвями, содержащими разные миграции:
https://gist.github.com/4076864
Он не решит все проблемы, о которых вы упомянули, но с учетом имени ветки:
Я постоянно делаю это вручную в нашем проекте, поэтому подумал, что было бы неплохо автоматизировать этот процесс.
источник
git checkout db/schema.rb
или имели в видуgit checkout -- db/schema.rb
? (т.е. с двойным тире)db/schema.rb
. :)Отдельная база данных для каждого филиала
Это единственный способ летать.
Обновление 16 октября 2017 г.
Я вернулся к этому через некоторое время и внес некоторые улучшения:
bundle exec rake git:branch
.db:clone_from_branch
задача принимаетSOURCE_BRANCH
и вTARGET_BRANCH
переменном окружении. При использованииgit:branch
он будет автоматически использовать текущую ветку какSOURCE_BRANCH
.config/database.yml
И чтобы вам было проще, вот как вы обновляете свой
database.yml
файл, чтобы динамически определять имя базы данных на основе текущей ветки.lib/tasks/db.rake
Вот задача Rake, позволяющая легко клонировать вашу базу данных из одной ветки в другую. Это принимает переменные среды a
SOURCE_BRANCH
и aTARGET_BRANCH
. На основе задачи @spalladino .lib/tasks/git.rake
Эта задача создаст ветвь git от текущей ветки (основной или другой), проверит ее и клонирует базу данных текущей ветки в базу данных новой ветки. Это гладкая автофокусировка.
Теперь все, что вам нужно сделать, это запустить
bundle exec git:branch
, ввести новое имя ветки и начать убивать зомби.источник
Возможно, вам следует принять это как намек на то, что ваша база данных для разработки слишком велика? Если вы можете использовать db / seed.rb и меньший набор данных для разработки, ваша проблема может быть легко решена с помощью schema.rb и seed.rb из текущей ветки.
Это предполагает, что ваш вопрос касается разработки; Не представляю, зачем вам нужно регулярно менять ветки в продакшене.
источник
db/seeds.rb
, я разберусь.Я боролся с той же проблемой. Вот мое решение:
Убедитесь, что и schema.rb, и все миграции зарегистрированы всеми разработчиками.
Для развертывания в производственной среде должен быть один человек / машина. Назовем эту машину машиной слияния. Когда изменения поступают на машину слияния, автоматическое слияние для schema.rb завершится ошибкой. Без вопросов. Просто замените содержимое тем, что было ранее для schema.rb (вы можете отложить копию или получить ее с github, если вы ее используете ...).
Вот важный шаг. Теперь миграции от всех разработчиков будут доступны в папке db / migrate. Продолжайте и запустите пакет exec rake db: migrate. Это приведет к восстановлению базы данных на машине слияния со всеми изменениями. Он также восстановит schema.rb.
Зафиксируйте и отправьте изменения во все репозитории (пульты и отдельные лица, которые тоже являются пультами). Вы должны быть сделаны!
источник
Это то, что я сделал, и я не совсем уверен, что рассмотрел все основы:
В разработке (с использованием postgresql):
Это намного быстрее, чем утилиты rake для базы данных, содержащей около 50 000 записей.
Для производства поддерживайте главную ветвь как священную, и все миграции регистрируются, shema.rb правильно объединен. Пройдите стандартную процедуру обновления.
источник
Вы хотите сохранить «среду баз данных» для каждой ветки. Посмотрите на скрипт smudge / clean, чтобы указать на разные экземпляры. Если у вас закончились экземпляры db, попросите скрипт выделить временный экземпляр, чтобы при переключении на новую ветку он уже был там, и его просто нужно было переименовать с помощью скрипта. Обновления БД должны запускаться непосредственно перед выполнением тестов.
Надеюсь это поможет.
источник
Я полностью чувствую лаваш, который у вас здесь. Насколько я понимаю, настоящая проблема в том, что во всех ветвях нет кода для отката определенных веток. Я живу в мире джанго, поэтому не очень хорошо разбираюсь в рейке. Я играю с идеей, что миграции живут в своем собственном репо, которое не разветвляется (git-submodule, о котором я недавно узнал). Таким образом, у всех веток есть все миграции. Липкая часть гарантирует, что каждая ветка ограничена только теми миграциями, которые им важны. Выполнение / отслеживание этого вручную было бы бесполезным и подверженным ошибкам. Но ни один из инструментов миграции не предназначен для этого. Это тот момент, когда у меня нет пути вперед.
источник
Я бы предложил один из двух вариантов:
Опция 1
seeds.rb
. Хороший вариант - создать исходные данные с помощью гема FactoryGirl / Fabrication. Таким образом вы можете гарантировать, что данные синхронизированы с кодом, если мы предположим, что фабрики обновляются вместе с добавлением / удалением столбцов.rake db:reset
команду run , которая эффективно удаляет / создает / заполняет базу данных.Вариант 2
Поддерживайте состояние базы данных вручную, всегда выполняя
rake db:rollback
/rake db:migrate
до / после проверки ветки. Предостережение: все ваши миграции должны быть обратимыми, иначе это не сработает.источник
О среде разработки:
Вы должны работать,
rake db:migrate:redo
чтобы проверить, обратим ли ваш сценарий, но имейте в виду, что всегда должен бытьseed.rb
с заполнением данных.Если вы работаете с git, ваш seed.rb должен быть изменен с изменением миграции, а выполнение
db:migrate:redo
для начала (загрузить данные для новой разработки на другом компьютере или в новой базе данных)Помимо «изменения», с вашими методами «вверх» и «вниз» ваш код всегда будет охватывать сценарии «изменения» в этот момент и при запуске с нуля.
источник