Я пытаюсь использовать Enum
в моей модели Mixin
Модель миксина выглядит следующим образом:
from sqlalchemy import Column, Integer, Enum
from enum import Enum as EnumClass
class MyEnum(EnumClass):
active = 1
deactive = 2
deleted = 3
class MyMixin:
id = Column(Integer(), primary_key=True)
status = Column(Enum(MyEnum), nullable=False, unique=False, default=MyEnum.active)
И у меня есть другие модели, наследующие мой миксин следующим образом:
class Inherited1(MyMixin, Base):
__tablename__ = 'test_table_1'
class Inherited2(MyMixin, Base):
__tablename__ = 'test_table_2'
Я использую PostgreSQL в качестве базы данных, когда я пытаюсь использовать Base.metadata.create_all()
, он возвращает следующую ошибку:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) type "myenum" already exists
Причина в том, что он пытается воссоздать перечислениевведите PostgreSQL, в качестве обходного пути можно определить перечисление для унаследованных классов и передать параметр name
в тип Enum
, используемый для столбца
Но я хотел знать, есть ли лучший способ использованияMyMixin
с типом Enum
и наследовать его для нескольких моделей?
Я должен добавить, что я использую Alembic для миграции, я даже пытался добавить create_type=False
в качестве параметра к sa.Enum()
в пределахsa.Column()
определение для моего типа Enum, и оно не сработало, например:
sa.Column('status', sa.Enum('active', 'deactive', 'deleted', name='myenum', create_type=False), nullable=False)
Обходной путь : я добавил эту часть в вопрос, потому что до сих пор не могудумаю, это лучшая практика
Я редактировал миграциюсценарий, изменив sa.Enum()
на sa.dialects.postgresql.ENUM()
sa.Column('status', sa.dialects.postgresql.ENUM('active', 'deactive', 'deleted', name='myenum', create_type=False), nullable=False)
Похоже, тип sa.Enum
не принимает параметр create_type
, поскольку он предназначен исключительно для PostgreSQL
Но явсе еще ищу лучший способ, который не требует внесения изменений в сценарий миграции