有没有办法让Enum类在创建新数据库时自动创建,比如标准Enum,还可以将它连接到运行process_bind_param
的TypeDecorator
?将PostgreSQL枚举与TypeDecorator结合起来
该第一码块创建一个Enum
类型保存之前自动小写输入,但是,不像正常Enum
,未在数据库中自动创建的特定的PostgreSQL枚举类型,所以运行create_all()
创建时导致错误该表,因为language_code
类型不存在于PostgreSQL模式中。
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
,但从来都不是。