Я использую Flask-Migrate (Alembic) для управления миграцией базы данных SQLAlchemy. Я работаю над двумя разными ветками с разными миграциями.
Как я могу сделать это проще? Может быть, другой инструмент, который больше похож на миграции Django, но для Flask?
Alembic требует, чтобы цепочка миграций соответствовала маркеру базы данных для текущей миграции. Если вы создаете и запускаете некоторые миграции в ветки, а затем переключаетесь на другую ветку, база данных помечается как находящаяся в миграции, которой больше не существует.
Чтобы работать с несколькими ветвями при использовании миграций, вам необходимо выяснить, какова последняя общая миграция в той ветки, на которую вы переходите, а затем сначала перейти на эту версию. Затем извлеките ветку и запустите любые миграции, уникальные для нее.
Например, предположим, что вы создали две ветки из ветки "dev" с именами "feature1" и "feature2", и у каждой есть одна новая миграция после "dev". Чтобы переключиться с "feature1" на "feature2":
flask db downgrade -1
.git checkout feature2
flask db upgrade
Если вы не хотите терять данные из-за понижения, которое удаляет столбцы или таблицы, вам нужно вместо этого восстановить и восстановить базу данных для каждой ветки.
Если вы работаете с "feature1" и объединяете его с "dev", вам необходимо обновить "feature2", чтобы он знал о новых миграциях, которые были объединены. Alembic будет поддерживать наличие нескольких ветвей, пока присутствуют все миграции., После объединения "feature2" вы можете сгенерировать миграцию слиянием, чтобы объединить две ветки миграции обратно в одну.
git checkout dev
, git merge feature1
git checkout feature2
, git merge dev
flask db upgrade
базы данных flask db upgrade
git checkout dev
, git merge feature2
flask db heads
flask db merge id1 id2
, подставляя идентификаторы из предыдущего шага.flask db upgrade
flask db heads
К сожалению, это ручной процесс. Alembic требует, чтобы цепочка миграции совпадала с маркером базы данных, и нет пути к этому. Вы можете написать git hook, чтобы помочь с этим, но это не то, что уже существует.