Работа на нескольких ветках с Flask-Migrate - PullRequest
1 голос
/ 16 апреля 2019

Я использую Flask-Migrate (Alembic) для управления миграцией базы данных SQLAlchemy.Я работаю над двумя разными ветками с разными миграциями.

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

Как мне сделать это проще?Может быть, другой инструмент, который больше похож на миграции Джанго, но для Flask?

1 Ответ

5 голосов
/ 16 апреля 2019

Alembic требует, чтобы цепочка миграций соответствовала маркеру базы данных для текущей миграции.Если вы создаете и запускаете некоторые миграции в ветви, а затем переключаетесь на другую ветку, база данных помечается как находящаяся в миграции, которой больше не существует.

Чтобы работать с несколькими ветками во время использования миграции, вам потребуетсячтобы выяснить, что является последней распространенной миграцией в ветви, на которую вы переключаетесь, затем сначала перейдите на эту версию.Затем извлеките ветку и запустите любые миграции, которые уникальны для нее.

Например, предположим, что вы создали две ветки из ветви "dev" с именами "feature1" и "feature2", и у каждой по одной новой миграциитак как "dev".Чтобы переключиться с «feature1» на «feature2»:

  1. Понизьте миграции, добавленные в ветвь, в данном случае 1: flask db downgrade -1.
  2. Извлеките ветку: git checkout feature2
  3. Примените все обновления для новой ветки: flask db upgrade

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


Если вы работаете с «feature1» и объедините его с «dev», вам необходимо обновить «feature2», чтобы он знал о новых миграциях, которыебыли объединены в. Alembic будет поддерживать наличие нескольких ветвей, пока присутствуют все миграции.После слияния «feature2» вы можете сгенерировать миграцию слиянием, чтобы объединить две ветви миграции обратно в одну.

  1. Слить «feature1» в «dev»: git checkout dev, git merge feature1
  2. Переключитесь на «feature2» и объедините «dev»: git checkout feature2, git merge dev
  3. Запустите миграцию из «dev» и «feature2»: flask db upgrade
  4. Продолжитьработает над "feature2".
  5. Объединение "feature2" в "dev": git checkout dev, git merge feature2
  6. Найдите идентификаторы миграции, которые необходимо объединить: flask db heads
  7. flask db merge id1 id2, подставляя идентификаторы из предыдущего шага.
  8. Обновление до слияния, обратите внимание, что есть только одна голова: flask db upgrade, flask db heads

К сожалению, это ручной процесс.Alembic требует, чтобы цепочка миграции соответствовала маркеру базы данных, и в настоящее время нет никакого способа обойти это.Вы можете написать git hook, чтобы помочь с этим, но это не то, что уже существует.

...