SQLAlchemy:在Mixin [PostgreSQL]

时间:2019-06-08 23:21:24

标签: python postgresql enums sqlalchemy

我正在尝试在我的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类型

但是我想知道是否有更好的方法将MyMixinEnum类型一起使用并继承多个模型?

我应该补充一点,我正在使用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

但是我仍在寻找一种不需要更改迁移脚本的更好的方法

0 个答案:

没有答案