有沒有辦法讓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
,但從來都不是。