我正在尝试在我的Mixin模型中使用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)
我还有其他模型像这样继承我的mixin:
class Inherited1(MyMixin, Base):
__tablename__ = 'test_table_1'
class Inherited2(MyMixin, Base):
__tablename__ = 'test_table_2'
当我尝试使用Base.metadata.create_all()
时,我正在使用PostgreSQL作为数据库,它返回以下错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) type "myenum" already exists
原因是它正在尝试在PostgreSQL中重新创建枚举类型,一种解决方法是在继承的类上定义枚举并将name
参数传递给用于列的Enum
类型>
但是我想知道是否有更好的方法将MyMixin
与Enum
类型一起使用并继承多个模型?
我应该补充一点,我正在使用Alembic进行迁移,甚至尝试在Enum类型的create_type=False
定义内将sa.Enum()
作为参数添加到sa.Column()
中,但没有这样做。像这样工作:
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
但是我仍在寻找一种不需要更改迁移脚本的更好的方法