在数据库创建时提供枚举

时间:2019-10-25 14:52:02

标签: python enums sqlalchemy

比方说,我有一个通用的Food sqlalchemy模型,我想将其重用于不同的应用程序。 在每个应用程序中,我都有一个FoodType枚举,其中包含我将要使用的不同类型的食物。

我希望能够将此特定于应用的枚举传递给我的通用模型。关于如何做到这一点的任何想法?

这是我的食物模型:

class Food(Base):
    type = Column(Enum(FoodType, name="l=food_type"))

我试图在通用模型中定义一个空的枚举,以便可以在每个应用程序中将其覆盖,但是显然不起作用,它会崩溃:

sqlalchemy.exc.StatementError: (builtins.LookupError) "PIZZA" is not among the defined enum values

1 个答案:

答案 0 :(得分:1)

Food设为mixin而非具体模型,然后使用declared_attr定义type

class FoodMixin:
    @declared_attr
    def type(cls):
        return Column(Enum(cls.food_type, name="food_type"))

然后在您的应用程序中创建具体模型,如下所示:

class Food(FoodMixin, Base):
    food_type = FoodType

另一种方法是为Food定义一个模型工厂,该工厂将枚举类型作为参数并生成一个模型:

def food_maker(FoodType, Base):
    class Food(Base):
        type = Column(Enum(FoodType, name="food_type"))

    return Food

以及在应用中:

Food = food_maker(FoodType, Base)

...或者让工厂返回一个mixin并从中继承。