将PostgreSQL Enum与TypeDecorator结合使用

时间:2013-06-04 18:44:56

标签: python postgresql sqlalchemy

有没有办法让Enum类在创建新数据库时自动创建(如标准枚举),还可以将其连接到运行TypeDecorator的{​​{1}}?

第一个代码块创建一个process_bind_param类型,在保存输入之前自动降低输入,但是,与普通Enum不同,特定的PostgreSQL枚举类型不会在数据库中自动创建,因此运行a Enum在创建表时会导致错误,因为PostgreSQL架构中不存在create_all()类型。

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() 的组合,这个组合在一个混合的单独的类中,并且还切换了TypeDecoratorsqlalchemy.types.Enum,但似乎无论如何我这样做,我要么得到一个自动创建的类,要么运行一个运行sqlalchemy.dialects.postgresql.ENUM的类,但不能同时运行。{/ p>

1 个答案:

答案 0 :(得分: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()