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