Как вручную сгенерировать скрипт миграции alembic, который обновляет столбец Enum

1

Технологии, которые я использую:

  • python 3.6
  • postgres 10.4
  • колба
  • flask_migrate
  • flask_sqlalchemy

До сих пор я полагался на сценарии python app.py db migrate которые возникают при вызове python app.py db migrate. Затем я применяю эти сценарии миграции, вызывая python app.py db upgrade. Однако мое последнее изменение связано с изменением Enum, которое я использовал для создания столбца. Вот упрощенный пример моего перечисления:

class EventType(Enum):
    started = 1
    completed = 2
    aborted = 2

(Обратите внимание на опечатку с повторяющимся значением 2.) Вот что я пытаюсь изменить Enum:

class EventType(Enum):
    started = 1
    completed = 2
    aborted = 3
    failed = 4

Мои изменения заключались в том, чтобы исправить опечатку и добавить новое значение в перечисление.

Вот (упрощенная) модель, которая использует это перечисление:

class Event(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    type = db.Column(db.Enum(EventType))

Вызов python app.py db migrate не обнаружил никаких изменений, и я прочитал в документации, что alembic (который используется под капотом в flask_migrate) автоматически не обнаруживает изменения перечисления. 1

Этот вопрос от ~ 6 лет назад, кажется, указывает, что есть лучший способ справиться с этой проблемой после Postgres 9.4

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

Теги:
sqlalchemy
alembic

1 ответ

0

Вот мое окончательное решение моей проблемы:

1) Создать пустой файл исправления с python app.py db revision --message "new event types"

2) Измените новый файл, введя следующие строки в метод upgrade():

op.execute("COMMIT")
op.execute("ALTER TYPE eventtype ADD VALUE 'failed'")

3) Сохраните и примените обычный способ с python app.py db upgrade.

Заметки:

  • Это не касается значения опечатки. Из того, что я мог сказать, Postgres не сохраняет значение перечисления python нигде и не заботится о том, что это такое.

  • Это не удаляет значения в методе downgrade(). Я не мог найти прямой способ сделать это, поэтому я просто проигнорировал его. В моем случае я не думаю, что это будет иметь значение, если понижение не удалит эти дополнительные значения.

  • Я узнал имя своего типа (тип eventtype), прочитав файл миграции, изначально создавший таблицу, включающую этот тип.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню