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

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

  • Python 3,6
  • postgres 10,4
  • колба
  • flask_migrate
  • flask_sqlalchemy

До сих пор я полагался на автоматически сгенерированные сценарии миграции, которые возникают в результате вызова 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, чтобы обнаружить это изменение и сгенерировать скрипт для меня.Пожалуйста, дайте мне знать, если мне нужно предоставить дополнительную информацию, чтобы помочь с ответом на этот вопрос.

1 Ответ

0 голосов
/ 05 декабря 2018

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

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

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

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

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

Примечания:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...