有没有办法让 Enum 类在创建新数据库时自动创建,就像标准 Enum 一样,而且还可以将它连接到运行 TypeDecorator
的 process_bind_param
?
第一个代码块创建一个 Enum
类型,在保存之前自动将输入小写,但是,与普通的 Enum
不同,特定的 PostgreSQL 枚举类型不会在数据库中自动创建,因此在创建表时运行 create_all()
会导致错误,因为PostgreSQL 模式中不存在 language_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.dialects.postgresql.ENUM
,但似乎无论我做什么,我要么得到一个自动创建的类,要么运行 process_bind_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()
关于python - 将 PostgreSQL 枚举与 TypeDecorator 结合使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16925235/