#java #flyway
Вопрос:
Допустим, мы разрабатываем функцию, и нам нужна новая таблица. Потрясающе, мы делаем вход на Взлетную полосу, и мы взлетаем и бежим! Затем, несколько дней спустя после некоторого тестирования, мы понимаем, подождите, этот столбец действительно должен был быть пустым звуком, или нам нужно поле, которое мы не ожидали кэшировать для повышения производительности, или по какой-либо причине наша версия модели данных в башне из слоновой кости не соответствовала реальности.
Простым решением было бы сделать еще один вход на взлетно-посадочную полосу. Но поскольку это даже не выходило за рамки разработки, это кажется плохим решением. Это действительно должно быть в оригинальной сборке. Но для этого мне нужно сбросить свою базу данных, что является большой тратой времени для чего-то столь простого.
Как я должен справляться с этим изо дня в день, чтобы защитить свое здравомыслие и свое время?
Комментарии:
1. Вы можете изменить файлы flyway и перенести свои данные локально, если это полезно.
2. Сброс вашей базы данных не должен быть проблемой. Ваши сценарии Flyway должны настраивать эту базу данных для вас в средах разработки/тестирования и обучения.
Ответ №1:
Просто в качестве дополнения к ответу Джулии интересная фраза в вопросе звучит так: «Но поскольку это даже не выходило за рамки разработки, это кажется плохим решением». Это хороший момент: ваш сценарий заключается в том, что внесенные вами изменения не прошли тестирование, поэтому их не должно быть в основной «истории миграции». Если вы можете принять стратегию ветвления/слияния, которая добавляет миграцию в ветвь «разработка» только после завершения модульного и интеграционного тестирования в вашей ветви, вы можете избежать этого.
Я расскажу об этом более подробно здесь, ветвясь и объединяясь при разработке баз данных с помощью Flyway. Flyway может довольно легко справиться с этим, если вы можете создать начальный файл миграции для ветви, которая создает версию ветви базы данных до точной версии (версии на момент ветвления). Процесс слияния может быть сложным, если одновременно выполняются разработки в одной и той же части базы данных или в зависимых объектах базы данных, но это, как правило, верно при разработке баз данных..
Комментарии:
1. Увидел вопрос и как раз шел сюда, чтобы напечатать это и дать ссылку на вашу статью. Спасибо, что избавили меня от работы. Ha!
Ответ №2:
В Flyway есть некоторая документация, в которой обсуждается использование Spawn для дополнения ваших сред разработки и тестирования путем создания временных баз данных и управления ими для вас. Одна часть этой страницы явно документирует «устранение ошибок» и «восстановление в предыдущие состояния».
Это звучит точно так же, как то, что вы хотели бы уметь делать.
Таким образом, после того как вы поняли, что сценарий миграции должен был быть другим, вы можете запустить spawnctl reset data-container <your_container>
его, чтобы вернуть базу данных в исходное состояние. Затем вы сможете flyway migrate
снова запустить свой сценарий фиксированной миграции, как если бы исходная ошибочная миграция никогда не была развернута.
Это должно быть значительно проще, чем сброс состояния базы данных вручную, и имеет то преимущество, что вы вернетесь к тому, с чего начали. Вы также можете создавать произвольные точки сохранения по ходу разработки, чтобы вернуться в различные известные состояния.
Ответ №3:
У простого решения есть одна важная особенность — оно будет точно отслеживать, через что прошла ваша база данных разработчиков, чтобы перейти в ее текущее состояние, и воспроизводить это точно в других средах; так что у вас не будет ошибок из-за неправильного сворачивания изменений.
Другим решением является написание дополнительных сценариев отмены для Flyway (примечание: платная функция), чтобы вы могли перемещаться вверх и вниз по истории версий, пока она вам не понравится.
В качестве альтернативы это будет работать без сброса базы данных: в DEV:
V1_0_1.sql: CREATE TABLE blah ...
V1_0_2.sql: ALTER TABLE blah ...
Затем, когда вы будете счастливы, измените сценарии в соответствии с реальностью:
V1_0_1.sql: CREATE TABLE blah (new version) ...
V1_0_2.sql: <commented out>
Это может быть выполнено как в рабочей среде, так и в процессе разработки flyway repair
, чтобы выровнять контрольные суммы файлов. Или, в аналогичном ключе, вы можете поддерживать два набора сценариев, один для разработки, а другой для производства, который содержит только те изменения, которые вы хотите продвигать. Ни один из них не защитит от непреднамеренного разрыва между дэв и прод. Как упоминалось в комментариях, тот факт, что сброс базы данных разработчиков-это боль, сам по себе является запахом и заслуживает повторного рассмотрения.