python - 将 PostgreSQL 枚举与 TypeDecorator 相结合

标签 python postgresql sqlalchemy

有没有一种方法可以让枚举类在创建新数据库时自动创建,就像标准枚举一样,但也可以将它连接到运行 process_bind_param< 的 TypeDecorator/?

第一个代码块创建了一个 Enum 类型,它在保存之前自动将输入小写,但是,与普通的 Enum 不同,特定的 PostgreSQL 枚举类型不会自动创建在数据库中,因此运行 create_all() 会在创建表时导致错误,因为 PostgreSQL 架构中不存在 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()

我还尝试了几种不同的组合,在混合的单独类中继承 TypeDecorator,并切换 sqlalchemy.types.Enumsqlalchemy.dialects.postgresql.ENUM,但似乎无论我做什么,我要么得到一个自动创建的类,要么得到一个运行 process_bind_param 的类,但从来没有两者。

最佳答案

这似乎可行,但如果有人知道更好的解决方案或发现此解决方案存在问题,那将仍然很棒。

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

关于python - 将 PostgreSQL 枚举与 TypeDecorator 相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16925235/

相关文章:

python - 图像分析曲线拟合

python - 在 Sublime Text 中构建 Python

sql - 有没有办法改善这个查询的计算成本?

php - postgresql全文搜索中的问题,包含单引号

python - 使用 PostgreSQL 数组存储多对多关系

python - 如何激活特定的 Python 环境作为我提交给 Slurm 的一部分?

python - TypeError:buf不是数字元组

java - Postgres : No suitable Driver found for jdbc

python - 使用 Beaker 缓存和 SQLAlchemy

python - 如何根据时间戳对 InstrumentedList 进行排序?