2013-06-04 48 views
4

有没有办法让Enum类在创建新数据库时自动创建,比如标准Enum,还可以将它连接到运行process_bind_paramTypeDecorator将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.Enumsqlalchemy.dialects.postgresql.ENUM,但似乎不管我做什么,我要么得到一个类它会自动创建,或者运行的类是process_bind_param,但从来都不是。

回答

2

这似乎工作,但如果有人知道更好的解决方案或看到这个问题,它仍然会很好。

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()