首页 > 解决方案 > SQLAlchemy 中的 cache_ok 标志是什么?

问题描述

我有SQLAlchemy的下一个自定义类型装饰器:

class TimeStamp(TypeDecorator):
    impl = DateTime
    cache_ok = True
    LOCAL_TIMEZONE = datetime.utcnow().astimezone().tzinfo

    def process_literal_param(self, value, dialect):
        return self.imple.process_literal_param(value, dialect)

    @property
    def python_type(self):
        return self.impl.python_type

    def process_bind_param(self, value: datetime, dialect):
        if value is None:
            return None
        if value.tzinfo is None:
            value = value.astimezone(self.LOCAL_TIMEZONE)
        return value.astimezone(timezone.utc)

    def process_result_value(self, value, dialect):
        if value is None:
            return None
        if value.tzinfo is None:
            return value.replace(tzinfo=timezone.utc)
        return value.astimezone(timezone.utc)

问题是SQLAlchemy要求我设置cache_ok标志...我试图在文档中阅读有关此标志的信息,但对我来说仍然不清楚。我不知道SQLAlchemy是如何使用它的。
它缓存什么?我的类型装饰器适合缓存吗?

标签: pythonsqlalchemy

解决方案


最近遇到了这个问题,找到了你的问题,没有答案:( .. 看了更远,查看了文档 ..

TypeDecorator.cache_ok 类级别标志指示此自定义 TypeDecorator 是否可以安全地用作缓存键的一部分。此标志默认为 None ,当 SQL 编译器尝试为使用此类型的语句生成缓存键时,它最初会生成警告。如果不能保证 TypeDecorator 每次都产生相同的绑定/结果行为和 SQL 生成,则该标志应设置为 False;否则,如果该类每次都产生相同的行为,则可以将其设置为 True。有关其工作原理的更多说明,请参见 TypeDecorator.cache_ok。

https://docs.sqlalchemy.org/en/14/core/custom_types.html#sqlalchemy.types.TypeDecorator

.. 因此,如果您确信您的 TypeDecorator 始终为给定值生成相同的绑定/结果,那么请继续并通过cache_ok = True在您的 TypeDecorator 类中设置值来发出该语句。


推荐阅读