SQLAlchemy: используйте Enum в Mixin [PostgreSQL] - PullRequest
2 голосов
/ 09 июня 2019

Я пытаюсь использовать 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

Но явсе еще ищу лучший способ, который не требует внесения изменений в сценарий миграции

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