2013-06-04 64 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()