polyanin
@polyanin
PHP Symfony & Golang developer

Как обнулить или объединить миграции и оставить одну?

Приветствую!
Есть проект на symfony4 + mysql
В нём есть стандартная папка с миграциями Migrations
Самих миграций накопилось много, несколько десятков.
Как сделать, чтобы осталось только одна миграция, с нуля до последнего текущего состояния?
При этом не потерять бы данные.
  • Вопрос задан
  • 106 просмотров
Пригласить эксперта
Ответы на вопрос 3
@HellWalk
Если миграции делались через
php bin/console make:migration
А под сохранением данных вы подразумеваете структуру таблиц, а не их содержимое, то все просто:

1. удаляете все миграции
2. удаляете все таблицы из базы (включая migrations)
3. выполняете еще раз команду "php bin/console make:migration"

P.S. На всякий случай, сделайте бекап базы и git-коммит, чтобы в случае чего откатить все назад.

P.P.S. Можно и данные в базе сохранить - сделать нулевым пунктом бекап базы, изменить его так, чтобы в нем остались только команды на добавление данных, и накатить дамп четвертым пунктом.
Ответ написан
IgorPI
@IgorPI
Есть такое понятие как накопительная миграция.
Если я не ошибаюсь то в доктрине она уже есть.

нужно удалить все миграции и выполнять специальную команду для создания файла накопительной миграции.

А далее всё начинается заново.
Ответ написан
Maksclub
@Maksclub
maksfedorov.ru
Боевая БД
Нужно понимать, что боевая БД уже не будет накатываться с первой миграции. Миграции старше последней (или нескольких последних миграций, куда еще есть шанс откатиться) на боевой БД проделываться не будут, боевой базе достанутся только будущие миграции. Потому дамп делать никакой не нужно (ну спец под эту операцию, эта операция не связан с боевой БД никак) — дальше прилетят только новые изменения.

На машине разработчика
Если все сделано аккуратно (когда работали с миграциями), то можно удалить все таблицы и попробовать сгенерировать diff — он сделает актуальную миграцию, которая необходима. Далее нужно удостовериться — не было ли придуманных вне ORM миграций и таблиц, крч сверить с боевой схемой. Также возможно миграции несли некоторые данные (ну например коды валют, которых всего 5-10 вы решили миграцией занести или пара дефолтных значений из таблицы settings, и подобные случаи) — нужно будет руками это повторить (или не повторять, если не нужно).
Если вы добились, что ПУСТОЙ БД накаткой миграций получается ровно то, что достигалось ранее, то:
  • вы спокойно можете удалить старые миграции и коммитить эту одну большую
  • перед выкаткой на прод — вы должны текущую миграцию занести в таблицу migration_versions руками


Done!

Все делается очень легко, мне как-то достался проект без доступа к старому GIT (и почему-то без миграций), но с боевой БД. Пришлось проделать приблизительно все тоже самое (не считая болевого обновления Symfony с 2.7 до 3.4 с Сонатой, было больно :):):))...
Все проделывания с миграциями заняли от силы полтора часа (в виду молодости и не опытности), было пару подводных моментов (типа у некоторых бандлов из vendor были свои папки со своими мииграциями) и данные нужны были. некоторые, а так все относительно легко
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
04 апр. 2020, в 21:01
35000 руб./за проект
04 апр. 2020, в 20:32
5000 руб./за проект
04 апр. 2020, в 20:30
25000 руб./за проект