Python 将PostgreSQL枚举与TypeDecorator组合

Python 将PostgreSQL枚举与TypeDecorator组合,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,有没有一种方法可以使Enum类在创建新数据库时自动创建,比如标准Enum,但也可以将其连接到运行process\u bind\u param的TypeDecorator 第一个代码块创建一个Enum类型,该类型在保存输入之前自动将其小写,但与普通的Enum不同,特定的PostgreSQL枚举类型不会在数据库中自动创建,因此运行create_all()会在创建表时导致错误,因为PostgreSQL架构中不存在语言\u code类型 class LowercaseEnum(sqlalchemy.ty

有没有一种方法可以使Enum类在创建新数据库时自动创建,比如标准Enum,但也可以将其连接到运行
process\u bind\u param
TypeDecorator

第一个代码块创建一个
Enum
类型,该类型在保存输入之前自动将其小写,但与普通的
Enum
不同,特定的PostgreSQL枚举类型不会在数据库中自动创建,因此运行
create_all()
会在创建表时导致错误,因为PostgreSQL架构中不存在
语言\u code
类型

class LowercaseEnum(sqlalchemy.types.TypeDecorator):
    '''Converts input to lowercase.'''

    impl = sqlalchemy.types.Enum

    def process_bind_param(self, value, dialect):
        return value.lower()

class Foo(Model):
    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
    language_code = sqlalchemy.Column(LowercaseEnum(*['de', 'en'], name='language_code'))
另一方面,如果我像在第二个代码块中那样定义自定义类型,那么在调用
create_all()
时会自动创建它,但在向数据库发送值时不会调用
process_bind_param
方法,因此小写不起作用

class LowercaseEnum(sqlalchemy.dialects.postgresql.ENUM, sqlalchemy.types.TypeDecorator):
    '''Converts input to lowercase.'''

    impl = sqlalchemy.types.Enum

    def process_bind_param(self, value, dialect):
        return value.lower()

我还尝试了在一个单独的类中继承
TypeDecorator
,以及切换
sqlalchemy.types.Enum
sqlalchemy.dialogs.postgresql.Enum
,但似乎无论我做什么,我都会得到一个自动创建的类,或者运行
process\u bind\u param
,但决不能同时运行两者的类。

这似乎是可行的,但如果有人知道更好的解决方案或发现此解决方案存在问题,这仍然是很好的

class LowercaseEnum(sqlalchemy.types.TypeDecorator, sqlalchemy.types.SchemaType):
    '''Converts input to lowercase.'''

    impl = sqlalchemy.dialects.postgresql.ENUM

    def _set_table(self, table, column):
        self.impl._set_table(table, column)

    def process_bind_param(self, value, dialect):
        return value.lower()